PDA

View Full Version : کمک در کار کردن با فایل ها



arya_jal
سه شنبه 21 اسفند 1386, 23:22 عصر
با سلام خدمت همه برنامه نویسان عزیز

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

این فایل دارای 50 ستون است اما تعداد سطرهای هرستون نامشخص وبا هم نابرابر هستند.

حال می خواستم بدانم چگونه می توانم این کار بکنم.

با تشکر

ICEMAN
چهارشنبه 22 اسفند 1386, 09:34 صبح
سلام ..
منظورت از 50 ستون و سطر های متفاوت چیه
ستون شاید Flield و سطر هم Record !!!!
تعداد سطرهای هرستون نامشخص وبا هم نابرابر هستند ؟؟ یعنی چی !

در مورد کار با فایل ها توی forum خیلی بحث شده
http://barnamenevis.org/forum/showthread.php?t=97755
و موارد زیاد دیگه ...

arya_jal
چهارشنبه 22 اسفند 1386, 14:49 عصر
منظورم یک آرایه 50 ستونی است که تعداد سطرهای هر ستون با هم برابر نباشند
من برای خواندن فایل و ذخیره آن درون آرایه کمی مشکل دارم

emad_67
چهارشنبه 22 اسفند 1386, 20:58 عصر
منظورم یک آرایه 50 ستونی است که تعداد سطرهای هر ستون با هم برابر نباشند
من برای خواندن فایل و ذخیره آن درون آرایه کمی مشکل دارم
خط به خط داده ها رو بخون و بعد کلمات اونو تفکیک کن و در آرایه قرار بده.

arya_jal
چهارشنبه 22 اسفند 1386, 23:47 عصر
در واقع من می خواهم بدون پرسیدن تعداد سطر یا ستون از کاربر اعداد درون فایل درون آرایه ذخیره شوند
اگر ممکن است قطعه کدی بنویسید
با تشکر

emad_67
پنج شنبه 23 اسفند 1386, 09:10 صبح
به نظرم باید یه ماکزیممی برای تعداد سطر ها قرار بدی حالا اگه پر هم نشد اون سطر مهم نیست. مثلا یه آرایه 50*50 که مطمئنی تعداد سطر ها بیشتر از 50 تا نیست. چون در صورتی که تعداد سطر ها مشخص نباشه من چیزی به ذهنم نرسید.
حالا به فرض اینکه تعداد ماکزیمم سطر ها مشخصه میخوایم یه فایل رو که در اون رشته ها به صورت نا منظمی ( یعنی با تعداد سطر های نا برابر) قرار گرفته اند رو بخونیم. برای این کار ابتدا یه خط رو میخونیم بعد تک تک کلمات اونو تفکیک میکنیم و هر کلمه رو در یک ستون قرار میدیم. واضح هست که هر یک سطری که از فایل خونده میشه معادل یک سطر آرایه هست:


#include<iostream>
#include<fstream>
#include<string>
using namespace std;
void main()
{
fstream inout("test.txt", ios::in | ios::out);

char s1[80];
char *s2[10][10];
int i,j;

for(i=0;!inout.eof();i++)
{
inout.getline(s1,80);
char *token=strtok(s1,"\t");
for(j=0;token;j++)
{
char *word=new char[10];
strcpy(word,token);
s2[i][j]=word;
cout<<"enter "<<s2[i][j]<<" "<<i<<" "<<j<<endl;
token=strtok(NULL,"\t");
}
}

}
در این کد s1 یک آرایه یک بعدی برای خوندن یک سطر از فایل و s2 هم یه آرایه 10*10 هست که قراره مقادیر در اون قرار بگیره. توسط تابع strtok هم تک تک کلمات یک خط از هم تفکیک میشن. من فرض رو بر این قرار دادم که رشته ها در فایل به وسیله یک tab از هم جداد شدن بنابراین در تابع strtok مقدار "t\" رو برای تفکیک رشته ها قرار دادم.
میتونی از کلاس string یا vector هم استفاده کنی ولی برای ساده تر و واضح تر بودن اینجوری نوشتم.

arya_jal
شنبه 25 اسفند 1386, 12:44 عصر
بسیار کد جالبی نوشته اید

اگر امکان دارد کمی در مورد آن توضیح بدهید

همچنین سوال دیگر من اینست که : آیا نحوه دسترسی به اعداد ذخیره شده در آرایه مانند حالت معمولی است ( مثلا بخواهم آنها را در یک فایل خروجی ذخیره کنم.) ؟

آن خانه هایی که در آرایه به آنها عددی تعلق نگرفته دارای چه مقداری هستند؟

با تشکر فراوان

emad_67
یک شنبه 26 اسفند 1386, 10:02 صبح
اگر امکان دارد کمی در مورد آن توضیح بدهید توی این کد ابتدا 1 خط از فایل خونده و و در آرایه s1 قرار میگیره و همون طور که گفتم یک خط از ورودی معادل 1 سطر از آرایه میشه. حالا ما یک خط رو خوندیم باید کلمات اونو جدا کنیم و هر کدوم رو توی یه خونه آرایه قرار بدیم. تابع strtok کار تفکیک کلمات رو انجام میده. این تابع آرایه و کاراکتری که باید بر اساس اون کلمات رو تفکیک کنه رو میگیره و اشاره گری به ابتدای رشته تفکیک شده بر میگردونه که در اینجا توی token قرار میگیره. در اینجا فرض کردم که کلمات در فایل توسط tab از هم جدا شدند برای همین در strtok از "t\" استفاده کردم. پس تا اینجا اولین کلمه تفکیک شده در اشاره گر token قرار میگیره و بعدش هم که دیگه واضحه، اونو توی یه خونه آرایه قرار میدیم. مراحل تفکیک یه خط رشته تا اونجا که strtok مقدار NULL رو بر گردونه ادامه پیدا می کنه بنابراین حلقه for داخلی تا NULL شدن token ادامه پیدا می کنه. این مراحل تا انتهای فایل که در حلقه for بیرونی کنترل میشه برای هر خط انجام میشه.

همچنین سوال دیگر من اینست که : آیا نحوه دسترسی به اعداد ذخیره شده در آرایه مانند حالت معمولی است ( مثلا بخواهم آنها را در یک فایل خروجی ذخیره کنم.) ؟بله مثل حالت معمولی هست.

آن خانه هایی که در آرایه به آنها عددی تعلق نگرفته دارای چه مقداری هستند؟در این مثال مقدار خاصی ندارند ولی قاعدتا باید ابتدا تمام خونه های آرایه (آرایه s2) را برابر NULL یا هر کاراکتری که که برای شما مشخص کننده خونه خالی هست قرار بدین تا موقع چاپ خروجی به مشکل بر نخورین.