PDA

View Full Version : نوشتن ركوردهايي از جنس آرايه در يك فايل



dr-data
شنبه 18 آذر 1391, 13:39 عصر
سلام به دوستان عزيز.
اول بايد بگم كه چندتا تاپيك در مورد كار با فايل ديدم ولي مطلب مفيدي گفته نشه بود و كلاً تعطيل شده بود تاپيكها، و من مجبورشدم تاپيك ايجاد كنم.

من با matlab زياد كار ميكنم، ولي شايد بدونيد كه matlab در حلقه هاي for كلاً تعطيله!! خوبيش سادگي كار با اونه.
ببينيد من حالتهاي مختلف 6 تا متغير رو ميخام به صورت ركورد به ركورد ذخيره كنم . حالا اين ذخيره ميتونه به صورت آرا باشه و يا استراكچر.

مثال:
10 20 30 50.22 1.3 5.6 98.252
160 20 30 50.22 15.3 54.6 98.252
190 20 30 50.22 16.3 594.6 98.252
106 20 30 50.22 13.3 58.6 98.252
.
.

انجام اين كار توي matlab خيلي آسونه ولي همونطور كه گفتم كنده و جواب نميده!
حالا اگه ممكنه يكي از اساتيد بگن چطوري اين ركوردها رو دونه دونه زير هم در يك فايل مثلاً CSV در زبان C بنويسم كه بتونم اون رو در MATLAB استفاده كنم؟
با زبان C در حد متوسط كار كردم. فقط بفرماييد چطوري در هر مرحله از يك حلقه FOR، مقدار يك آرايه رو در يك ركورد فايل ذخيره كنم.

در ظاهر سادس ولي به نظر انجامش در زبان C خيلي كار ميبره! درسته؟

با تشكر از اساتيد

hadi0x7c7
دوشنبه 20 آذر 1391, 19:13 عصر
این چیزی هست که میخوای ؟
#include <cstdio>
#include <iostream>

using namespace std;

void write_array(double arr[] ,int len, char* fname) {
FILE* fout = fopen(fname, "w");

int i;
for(i = 0; i < len; i++) {
if(i == len -1)
fprintf(fout, "%lf", arr[i]);
else
fprintf(fout, "%lf,", arr[i]);
}
}

int main() {

double values[] = {10 ,20 ,30 ,50.22 ,1.3 ,5.6 ,98.252};
char* fname = "d:/my_file.cvs";
write_array(values, 7, fname);
}

dr-data
دوشنبه 20 آذر 1391, 23:23 عصر
سلام آقا هادي.
برنامه رو با turbo c++ كامپايل كردم اين پيامها رو ميده:
Linker warning: no module definition file specified:using defaults
linker fatal: unable toopen file .exe

بچه ها كارم گيره لطفاً اگه كسي ميتونه راهنمايي كنه، تاپيكاي ديگه يادر مورد vb هست يا c# من با c يا c++ ميخام.

#target
سه شنبه 21 آذر 1391, 08:53 صبح
این خطا گفته فایل رو نمیتونه باز کنه
تو خطا اسمی برا فایل نزده چرا؟
ممکنه هم فایل در حال اجرا باشه این نمیتونه تغییرش بده

dr-data
سه شنبه 21 آذر 1391, 09:50 صبح
این خطا گفته فایل رو نمیتونه باز کنه
تو خطا اسمی برا فایل نزده چرا؟
ممکنه هم فایل در حال اجرا باشه این نمیتونه تغییرش بده

سلام
من قبل از كامپايل، تو درايو دي و با اسمي كه تو برنامه هست يه فايل csv ايجاد كردم.

به نظر خودم اين خطا داره ميگه بايد فايل رو به كامپايلر هم معرفي كني! شاي از طريق يه منويي...

omidshaman
سه شنبه 21 آذر 1391, 10:58 صبح
کمپایلرتو عوض کن turbo C++‎‎‎ بدرد نمیخوره...
کدپست 2 هم مشکل داره وقتی اجرا میشه خروجی میشه
-0.000000,-0.000000,-0.000000,-0.000000,-0.000000,-0.000000,-0.000000
من خیلی وقته c کار نکردم ولی احتمالا خط 12 باید باشه

fprintf(fout, "%f", arr[i]);
هدرتو بزار stdio.h ببین درست میشه هر چند که این اروری که گذاشتی ربطی به این چیزا نداره
در ضمن وقتی هم که کار با فایل به مراتب ساده تر از c تو C++‎‎ هست من دلیلی نمی بینم از c استفاده بشه

#include <iostream>
#include<fstream>
#include<string>
using namespace std;
void write_array(double arr[] ,int len, string fname);
void write_array(double arr[] ,int len, string fname) {
ofstream fout;
fout.open(fname);
int i;
for(i = 0; i < len; i++) {
if(i == len -1)
fout<<arr[i];
else
fout<<arr[i]<<",";
}
}

int main() {

double values[] = {10 ,20 ,30 ,50.22 ,1.3 ,5.6 ,98.252};
string fname = "d:/my_file.cvs";
write_array(values, 7, fname);
}

dr-data
سه شنبه 21 آذر 1391, 11:54 صبح
سلا اميدجان

درمورد كامپايلر بايد بگم كه فعلاً چيز ديگه اي نصب دارم، visual studio 2008 جواب ميده؟ شما با چي كامپايل كردي؟

منم زياد c كار نميكنم ولي مجبورم چون به سرعت بالا نياز دارم، بايد در 10 تا حلقه for حدود 10000000000 ركورد رو محاسبه و تو يه فايلي بنويسم.

c و c++ و c# از لحاظ سرعت چقدر تفاوت دارن؟

omidshaman
سه شنبه 21 آذر 1391, 12:14 عصر
c,c++ تفاوتشون خیلی خیلی کمه شایدبعضی وقتا سی 2-3 درصد سریعتر باشه! c# کار نکردم ...
اره visual studio جواب میده
من با codeblock کمپایل کردم

hadi0x7c7
سه شنبه 21 آذر 1391, 12:19 عصر
برنامه رو با turbo C++‎‎‎ كامپايل كردم اين پيامها رو ميده:
Linker warning: no module definition file specified:using defaults
linker fatal: unable toopen file .exe


من اینو با VC++‎‎‎ 2010 Express کامپایل کردم ممکنه به خاطر c/C++‎‎‎ بودن کد باشه این ممکنه اررور نده چون ansic c هستش. من اینو با VC++‎‎‎ 2010 Express کامپایل کردم اینو تو فالی چاپ کرد.


10.000000,20.000000,30.000000,50.220000,1.300000,5 .600000,98.252000


#include <stdio.h>
void write_array(double arr[], int len, char* fname) {
FILE* fout = fopen(fname, "w");

int i;
for (i = 0; i < len; i++) {
if (i == len - 1)
fprintf(fout, "%lf", arr[i]);
else
fprintf(fout, "%lf,", arr[i]);
}
fclose(fout);
}
int main() {

double values[] = { 10, 20, 30, 50.22, 1.3, 5.6, 98.252 };
char* fname = "d:/file.cvs";
write_array(values, 7, fname);
printf("Done\n");
}

omidshaman
سه شنبه 21 آذر 1391, 12:27 عصر
من اینو با VC++‎‎‎‎ 2010 Express کامپایل کردم ممکنه به خاطر c/C++‎‎‎‎ بودن کد باشه این ممکنه اررور نده چون ansic c هستش. من اینو با VC++‎‎‎‎ 2010 Express کامپایل کردم اینو تو فالی چاپ کرد.


اره به خاطر همون c/C++‎‎‎‎ بودن کده الان درسته

dr-data
سه شنبه 21 آذر 1391, 12:29 عصر
من اینو با VC++‎‎ 2010 Express کامپایل کردم ممکنه به خاطر c/C++‎‎ بودن کد باشه این ممکنه اررور نده چون ansic c هستش. من اینو با VC++‎‎ 2010 Express کامپایل کردم اینو تو فالی چاپ کرد.


10.000000,20.000000,30.000000,50.220000,1.300000,5 .600000,98.252000

#include <stdio.h>
void write_array(double arr[], int len, char* fname) {
FILE* fout = fopen(fname, "w");

int i;
for (i = 0; i < len; i++) {
if (i == len - 1)
fprintf(fout, "%lf", arr[i]);
else
fprintf(fout, "%lf,", arr[i]);
}
}
int main() {

double values[] = { 10, 20, 30, 50.22, 1.3, 5.6, 98.252 };
char* fname = "d:/file.cvs";
write_array(values, 7, fname);
printf("Done\n");
}


ممنون هادي جان
فقط پوينتري كه به شماره ركورد اشاره ميكنه رو چطور بايد افزايش داد؟ چون همونطوري كه گفتم هر ركورد در يك سطر جدا بايد ذخيره بشه

ويژوال استديو رو بايد نصب كنم تا ببينم بازم ارور ميده يا نه.

ممنون

hadi0x7c7
سه شنبه 21 آذر 1391, 13:54 عصر
میتونی ارایه دو بعدی به تابع پاس بدی و اونو به نسبت تغییر بدی یا توی یک حلقه همهی ارایه هاتو بنویسی و فایلو به صورت "a" باز کنی به جای "w".

dr-data
سه شنبه 21 آذر 1391, 18:45 عصر
شايد سوالم رو بد گفتم، منظورم اينه بلاخره يه ايندكسي بايد وجود داشته باشه كه ما بگيم تو كدوم ركورد بنويسه و يا از كدوم ركود بخون....
من فقط يه آرايه دارم كه بعد از كلي محاسبه در هر حلقه مقدارش تغيير ميكنه و هربار مقدار اين آرايه بايد تو يه ركورد ذخيره بشه...

نميدونم شايد تو C‌ سيستم نوشتن اينطوري نيست!

ممنون

dr-data
شنبه 25 آذر 1391, 22:16 عصر
هادي جان با visual studio درست كار ميكنه:تشویق:
فقط الان مشكل اينه كه هربار تو همون خط اول ينويسه چطوري ميشه رفت به خط بعد؟ بلاخره بايد يه ايندكسي باشه كه تعيين كننده ي خط باشه

ممنون

omidshaman
شنبه 25 آذر 1391, 22:24 عصر
منظورت اینه چجوری تو فایل بری خط بعد بنویسی دیگه ؟
اگر اره کافیه یک \n تو فایل چاپ کنی

fprintf(fout, "\n");

dr-data
شنبه 25 آذر 1391, 22:42 عصر
منظورت اینه چجوری تو فایل بری خط بعد بنویسی دیگه ؟
اگر اره کافیه یک \n تو فایل چاپ کنی

fprintf(fout, "\n", arr[i]);

سلام
آقا اميد ميشه بگي دقيقاً كجا بايد اين خط رو اضافه كنم؟ هرجا امتحان ميكنم جواب نميگيرم

omidshaman
شنبه 25 آذر 1391, 22:53 عصر
اینو تست کن

#include <stdio.h>
void write_array(double arr[], int len, char* fname) {
FILE* fout = fopen(fname, "a");

int i;
for (i = 0; i < len; i++) {
if (i == len - 1)
fprintf(fout, "%lf", arr[i]);
else
fprintf(fout, "%lf,", arr[i]);
}
fprintf(fout, "\n");
fclose(fout);
}
int main() {

double values[] = { 14, 20, 30, 50.22, 1.3, 5.6, 98.252 };
double values2[] = { 10, 20, 30, 50.22, 1.3, 5.6, 98.252 };
char* fname = "d:/file.cvs";
write_array(values, 7, fname);
write_array(values2, 7, fname);
printf("Done\n");
}

dr-data
شنبه 25 آذر 1391, 23:07 عصر
اینو تست کن

#include <stdio.h>
void write_array(double arr[], int len, char* fname) {
FILE* fout = fopen(fname, "a");

int i;
for (i = 0; i < len; i++) {
if (i == len - 1)
fprintf(fout, "%lf", arr[i]);
else
fprintf(fout, "%lf,", arr[i]);
}
fprintf(fout, "\n");
fclose(fout);
}
int main() {

double values[] = { 14, 20, 30, 50.22, 1.3, 5.6, 98.252 };
double values2[] = { 10, 20, 30, 50.22, 1.3, 5.6, 98.252 };
char* fname = "d:/file.cvs";
write_array(values, 7, fname);
write_array(values2, 7, fname);
printf("Done\n");
}


مرسي داداش گلم عالي جواب داد، واقعاً ممنونم.

در مورد خوندن هم ميتوني كمك كين؟ دقيقاً به همين سبك دونه به دونه ركوردها رو بخوام بخونم و يا يه ركورد خاص رو بخوام بخونم.

بازم ممنون از لطفت

omidshaman
شنبه 25 آذر 1391, 23:44 عصر
مرسي داداش گلم عالي جواب داد، واقعاً ممنونم.

در مورد خوندن هم ميتوني كمك كين؟ دقيقاً به همين سبك دونه به دونه ركوردها رو بخوام بخونم و يا يه ركورد خاص رو بخوام بخونم.

بازم ممنون از لطفت
بستگی داره خودتون کدومشو بخواین هر مدلی که بخواین میشه