PDA

View Full Version : خواندن آرایه از فایل txt



sa1378
جمعه 27 تیر 1393, 16:40 عصر
سلام
این کد اشکالش چیه که اعداد توی تکست رو کامل نمیخونه؟
مثلا من 20 تا عدد دادم 7و8 تا بیشتر چاپ نمیشه
int number[100]={0};
ifstream num("test.txt",ios::in);
if(!num)
{
cerr<<"File not found"<<endl;
exit(1);
}
for(int i=0;num>>number[100];i++)
{
num>>number[i];
cout<<number[i]<<endl;

}
cout<<endl;

مسعود اقدسی فام
جمعه 27 تیر 1393, 17:37 عصر
اگه num>>number[100] اشتباه تایپی نیست (شرط ادامه‌ی حلقه) منظورتون ازش چیه؟ اگه اشتباه هست که فایل رو هم بگید که چطور با اعداد پر کردید. شاید از اون باشه مشکل.

a.r.khoshghalb
شنبه 28 تیر 1393, 04:31 صبح
دوست عزیز در واقع این برنامه شما نصف تعداد اعداد توی فایل رو خروجی باید بده.
چون شما یه بار یه عدد می خونی و میریزی توی [number[100 برای چک کردن شرط حلقه ات بعد که رفت تو حلقه عدد بعدی رو می خونی و خروجی میدی.
کد صحیح اینه :

for(int i=0;num>>number[i];i++)
{
cout<<number[i]<<endl;
}

sa1378
شنبه 28 تیر 1393, 11:08 صبح
اگه num>>number[100] اشتباه تایپی نیست (شرط ادامه‌ی حلقه) منظورتون ازش چیه؟ اگه اشتباه هست که فایل رو هم بگید که چطور با اعداد پر کردید. شاید از اون باشه مشکل.

نمیدونم چرا اینجوری نوشتم
وقتی داشتم یاد میگرفتم نوشتن توی فایل رو این دستور رو گفته بود و تا وقتی که ctrl+z رو بزنیم کار میکرد
الانم من اونجوری نوشتم
فکر نکردم بهش

sa1378
شنبه 28 تیر 1393, 11:13 صبح
دوست عزیز در واقع این برنامه شما نصف تعداد اعداد توی فایل رو خروجی باید بده.
چون شما یه بار یه عدد می خونی و میریزی توی [number[100 برای چک کردن شرط حلقه ات بعد که رفت تو حلقه عدد بعدی رو می خونی و خروجی میدی.
کد صحیح اینه :

for(int i=0;num>>number[i];i++)
{
cout<<number[i]<<endl;
}


درست شد
دستتون درد نکنه
یه سوال دیگه
چجوری میشه یه متن مثلا 20 خطی رو بخونی از فایل txt?

مسعود اقدسی فام
شنبه 28 تیر 1393, 11:51 صبح
نمیدونم چرا اینجوری نوشتم
وقتی داشتم یاد میگرفتم نوشتن توی فایل رو این دستور رو گفته بود و تا وقتی که ctrl+z رو بزنیم کار میکرد
الانم من اونجوری نوشتم
فکر نکردم بهش
خب پس دقیقا مشکل همین بوده که عملکرد اون قسمت رو نمی‌دونستید و دو بار کد خوندن از فایل رو نوشته بودید. اما منظور من از دید خوندن از فایل نبود. به این خاطر پرسیدم که وقتی آرایه‌ی number‌ رو صد عنصری تعریف کردید از [number[0 تا [number[99 معنی داره. درسته که خطایی به خاطر [number[100 دریافت نمی‌کنید، اما در واقع به محلی از حافظه اشاره می‌کنید که در اختیار شما نیست و اگه چیزی اونجا ذخیره کنید هیچ تضمینی وجود نداره که خارج از کد شما تغییر نکنه.

a.r.khoshghalb
شنبه 28 تیر 1393, 23:15 عصر
درست شد
دستتون درد نکنه
یه سوال دیگه
چجوری میشه یه متن مثلا 20 خطی رو بخونی از فایل txt?

اون کدی که شما از یه جایی خوندی و نوشتی میاد و تا تو فایل چیزی هست می خونه. برای خوندن 20 خط:

string s[100];
for (int i = 0; i < 20; i++)
{
getline(num,s[i]);
}




توجه کن که نمی تونی یک خط رو بخونی و بریزی تو integer. باید حتما یک string تعریف کنی و اون تو بریزی بعد هر کار می خوای باهاش بکنی.

sa1378
یک شنبه 29 تیر 1393, 10:04 صبح
اون کدی که شما از یه جایی خوندی و نوشتی میاد و تا تو فایل چیزی هست می خونه. برای خوندن 20 خط:

string s[100];
for (int i = 0; i < 20; i++)
{
getline(num,s[i]);
}




توجه کن که نمی تونی یک خط رو بخونی و بریزی تو integer. باید حتما یک string تعریف کنی و اون تو بریزی بعد هر کار می خوای باهاش بکنی.
میدونم که باید توی string ریخت
اون که برای عدد بود این سوالم با اون فرق داشت

sa1378
جمعه 03 مرداد 1393, 14:25 عصر
یه مشکل برام به وجود اومد گفتم اینجا بگم
اینکد فقط 3 تا حرف رو چاپ میکنه
چرا؟
تمام حروف توی فایل تکست پشت سر هم هستند
char s[200];
ifstream st("m.txt",ios::in);
if(!st)
{
cerr<<"File not found"<<endl;
exit(1);
}

for(int i=0;s[i]!=NULL;i++)
{
st>>s[i];
}

for(int j=0;s[j]!=NULL;j++)
{
cout<<s[j];

rahnema1
جمعه 03 مرداد 1393, 16:22 عصر
در ابتدا شما یک آرایه تعریف کردید ولی آن را مقدار دهی اولیه نکردید یعنی 200 عضو s هر کدوم می تونند یک عدد مثلا تصادفی باشند
نکته دوم اینه که شما از NULL استفاده می کنید. NULL اگه بخواد به عنوان عدد در نظر گرفته بشه مساوی صفر هست
اینکه چرا 3 تا عدد چاپ می کنه علتش این می تونه باشه که موقع پر کردن آرایه 3 تا خونه اول را که پشت سر گذاشتی و به خونه بعدی رسیدی ، اون خونه (تصادفا) صفر داخلش قرار داره در نتیجه حلقه متوقف میشه

sa1378
شنبه 04 مرداد 1393, 08:25 صبح
برنامه رو چجوری بنویسم؟
الان اینجوری نوشتم:
char s[200];

for(int k=0;k<200;k++)
{
s[k]='a';
}

ifstream st("m.txt",ios::in);
if(!st)
{
cerr<<"File not found"<<endl;
exit(1);
}

for(int i=0;s[i-1]!='';i++)
{
st>>s[i];
}

for(int j=0;s[j]!='';j++)
{
cout<<s[j];
}

برنامه اجرا نمیشه و اون پایین دوبار مینویسه empty character constant

rahnema1
شنبه 04 مرداد 1393, 08:39 صبح
میشه بگید دقیقا چیکار می خواهید بکنید و محتوای فایل txt دقیقا چیه؟

sa1378
شنبه 04 مرداد 1393, 10:26 صبح
هیچی ازمایشی هست برای تمرین
توی فایل تکست نوشته:
kgsfyuewufheuiofheulhfldhsjfdb
میخوام توی ارایه ذخیره بشن

مسعود اقدسی فام
شنبه 04 مرداد 1393, 10:42 صبح
برنامه رو چجوری بنویسم؟
الان اینجوری نوشتم:
char s[200];

for(int k=0;k<200;k++)
{
s[k]='a';
}

ifstream st("m.txt",ios::in);
if(!st)
{
cerr<<"File not found"<<endl;
exit(1);
}

for(int i=0;s[i-1]!='';i++)
{
st>>s[i];
}

for(int j=0;s[j]!='';j++)
{
cout<<s[j];
}

برنامه اجرا نمیشه و اون پایین دوبار مینویسه empty character constant

دو تا سوال؛

چطور انتهای فایل رو تشخیص می‌دید؟

منظورتون از

s[i-1]!=''



برای ادامه‌ی حلقه، و خود[s[i-1 چیه؟ اگه i = 0 باشه این عبارت مفهومش چی می‌شه؟

sa1378
یک شنبه 05 مرداد 1393, 08:59 صبح
آره
اگه i صفر باشه نمیشه
من میخواستم چون متن پشت سر همه اگه دید قبلی خالیه پس دیگه از فایل نخونه چون حتما اینم خالیه
انتهای فایل رو هم اینجوری میشه تشخیص داد

الان فهمیدم اشتباهه
ولی چجوری بنویسم؟

rahnema1
یک شنبه 05 مرداد 1393, 09:02 صبح
واسه اینکه آرایه را ابتدا با صفر پر کنید این کار کنید
char s[200]={};
واسه خوندن چند روش هست

st>>s;
یا
int i=0;
while(st>>s[i++]);
یا
for(int i=0;st>>s[i++];);
یا
for(int i=0;!st.eof();i++)
{
st>>s[i];
}

اینا هم واسه چاپ

cout<<s;
یا
int i=0;
while(s[i])
{
cout<<s[i++];
}
یا...

sa1378
یک شنبه 05 مرداد 1393, 23:00 عصر
واسه اینکه آرایه را ابتدا با صفر پر کنید این کار کنید
char s[200]={};
واسه خوندن چند روش هست

st>>s;
یا
int i=0;
while(st>>s[i++]);
یا
for(int i=0;st>>s[i++];);
یا
for(int i=0;!st.eof();i++)
{
st>>s[i];
}

اینا هم واسه چاپ

cout<<s;
یا
int i=0;
while(s[i])
{
cout<<s[i++];
}
یا...


ممنون
دو تا سوال eof چیه؟
چرا کد آخر نوشتین cout<<s[i++ ]

اول ++ اجرا میشه یا ارایه؟

rahnema1
یک شنبه 05 مرداد 1393, 23:06 عصر
ممنون
دو تا سوال eof چیه؟
چرا کد آخر نوشتین cout<<s[i++ ]

eof یعنی end of file یعنی انتهای فایل

سوال دوم: تا وقتی که مقدار خونه های s برابر صفر نشده به چاپ اون ادامه بده
شکل ساده تر اون برنامه اینجور میشه

int i=0;
while (s[i]!=0)
{
cout<< s[i];
i=i+1;
}

sa1378
یک شنبه 05 مرداد 1393, 23:25 عصر
ببخشید زیاد برام مشکل پیش میاد
حالا توی این کد میخوام وقتی توی متن یه space زده بودن توی اجرا بره خط بعد یا همون اندلاین
و اگه دو تا space بود متوقف شه
یه مشکل اینه که چجوری با اسپیس آرایه بگیریم
فکر کنم با اشاره گر بشه نوشت ولی زیاد کار با فایل رو بلد نیستم

بقیش رو فکر کنم با این بشه
int i=1;

while(s[i]!=0 && s[i-1]!=0 )
{
if(s[i]!=0)
cout<<s[i];
else if(s[i]==0)
cout<<endl;
i++;
}
ولی اینم اولی رو نمیگیره

rahnema1
یک شنبه 05 مرداد 1393, 23:43 عصر
اگه می خواهید اسپیس را بگیره اینطور می تونید استفاده کنید

st.read(&s[i],1)
if (s[i]== ' ')
//...
i=i+1;

rahnema1
یک شنبه 05 مرداد 1393, 23:56 عصر
st.get(s[i]);