PDA

View Full Version : سوال: خواند از يك فايل



بانوی ایران
سه شنبه 29 دی 1388, 00:49 صبح
سلام دوستان
من يه كد خيلي ساده دارم كه قراره يه عدد رو از توي يه فايل بخونه

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main()
{
int a;
FILE *input_file=fopen("in.txt","r");
if (input_file==NULL)
{
printf("error");
exit(EXIT_FAILURE);
}
else
{
fscanf (input_file,"%d",&a);
fclose(input_file);
a++;
printf("%d",a);
}
getch();
return 0;
}
من يه شرط گذاشتم كه nullرو چك كنه و بعدش كه scanكرد يه printfگذاشتم كه ببينم درست كار كرده يا نه
اما مشكل من اينه كه وقتي اين برنامه روrunميكنم صفحه سريعا باز و بسته ميشه (ازgetch وهمچنينsystem("pause")هم استفاده كردم ولي مشكل از جاي ديگست)
ميشه بهم راهنمايي كنيد چرا اينجوري ميشه دستور printرو هم حذف كردم تغييري نكرد همون اتفاق ميافته:عصبانی++:

mabbaszadegan
سه شنبه 29 دی 1388, 00:59 صبح
این خط رو ببین :

exit(EXIT_FAILURE);
خب ، وقتی برای بار اول برنامه رو اجرا میکنی ، فایل خالیه ، پس میاد از برنامه بیرون ، این خط رو حذف کن درست میشه

موفق باشید

بانوی ایران
سه شنبه 29 دی 1388, 01:06 صبح
سلام
فايل خالي نيست توش عدد 1 رو گذاشتم
اون خط رو هم كه حذف كنم
همش قسمت errorرو printميكنه

mabbaszadegan
سه شنبه 29 دی 1388, 01:18 صبح
نمیدونم ،
به نظرم منطقیه که فقط error چاپ کنه ، من زیاد با دستورات C آشنا نیستم ، اگه ممکنه یه خط به قبل از if اضافه کنید تا یه مقداری رو بریزه توفایل ؛ بعد کدو بذارید ببینم

بانوی ایران
سه شنبه 29 دی 1388, 01:32 صبح
اخه مشكل من اينه كه من كامپايلرم dev cppهست وتوي devنميشهappendكرد يا بايد readكرد ياwrite
اخه فايل كه خالي نيست نبايد nullبده
كاش ارور ميداد ارور هم نميده سريع صفحه بسته ميشه:عصبانی++:

mabbaszadegan
سه شنبه 29 دی 1388, 01:34 صبح
منم با ویژوال استودیو کار میکنم ، میگم اگه مشکلی ندارید با fstream بنویسید ، شاید اونطوری بیشتر بتونم کمک کنم

بانوی ایران
سه شنبه 29 دی 1388, 01:41 صبح
سي پلاس پلاس؟
بلد نيستم بلدم بودم هم فايده اي نداشت ميخوام اينو ياد بگيرم كه هم توي پروژم استفاده كنم هم اينكه امتحان دارم
خيلي ممنون از توجهتون

mabbaszadegan
سه شنبه 29 دی 1388, 02:38 صبح
من اینو با fstream نوشتم ، گفتم بذارم شاید کمکتون کنه


#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <stdlib.h>
#include <fstream>
using namespace std;
int main()
{
int a;
fstream input_file;
input_file.open("in.txt",ios::app);

if (input_file==NULL)
{
printf("error");

}
else
{
input_file<<&a;
input_file>>a;
cout<<a;
input_file.close();
a++;

}
_getch();
return 0;
}

clover
سه شنبه 29 دی 1388, 11:06 صبح
برنامه شما را تست کردم، کاملا درست کار می کنه. علت اینکه روی سیستم شما خطا میده اینه که فایل in.txt پیدا نمیشه، این فایل باید در مسیر جاری برنامه قرار داشته باشه تا برنامه شما بتونه بازش کنه، در ++Visual C مسیر جاری همون پوشه ای هست که فایل main.cpp در اون قرار داره، اما در ++Dev C نمی دونم.
اگر در پیدا کردن مسیر جاری مشکل دارید برای تست برنامه به این صورت عمل کنید:
فایل را در درایو c قرار بدید و مسیر فایل را به این صورت اصلاح کنید:

FILE *input_file=fopen("c:\\in.txt","r");

بانوی ایران
سه شنبه 29 دی 1388, 12:13 عصر
ممنون ولي اينم فايده نداشت (اصلا فايل من اول توي cبود بعد كه ديدم كار نميكنه انتقالش دادم توي فولدر برنامم بازم فايده نداشت)
خيلي زود بسته ميشه
ولي ميگيد كد درسته؟

clover
سه شنبه 29 دی 1388, 13:36 عصر
ممنون ولی اینم فایده نداشت (اصلا فایل من اول توی cبود بعد که دیدم کار نمیکنه انتقالش دادم توی فولدر برنامم بازم فایده نداشت)
خیلی زود بسته میشه
ولی میگید کد درسته؟
برنامتون درست کار می کنه، در اجرا هم خروجی 2 میده.
تابع fopen زمانی NULL بر می گردونه که به هر علتی نتونه فایل را باز کنه (مثلا فایل در مسیر مربوطه نباشه و یا نام فایل اشتباه باشه) . بنابراین پیشنهاد می کنم که مسیر، پسوند و نام فایل را به دقت چک کنید.
راه دیگه ای هم که به ذهنم میرسه اینه که شما فایل را در خود برنامه ایجاد کنید، عدد 1 را داخل اون بنویسید و بعد ادامه برنامه، با این کار مطمئن خواهید شد که فایل در مسیر جاری وجود داره و امکان خطا در آدرس دهی فایل به صفر میرسه.
بعد با جستجو می تونید بفهمید که مسیر جاری فایل کجاست.
این کد را امتحان کنید و اگر باز هم مشکلی بود باید در جای دیگری به غیر از موارد ذکر شده در بالا دنبال راه حل مشکل باشید:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main()
{
int a;

FILE *output_file=fopen("in.txt","w");
fprintf(output_file, "1");
fclose(output_file);

FILE *input_file=fopen("in.txt","r");
if (input_file==NULL)
{
printf("error");
exit(EXIT_FAILURE);
}
else
{
fscanf (input_file,"%d",&a);
fclose(input_file);
a++;
printf("%d",a);
}
getch();
return 0;
}
موفق باشید

amir-yeketaz
سه شنبه 29 دی 1388, 14:44 عصر
منم با نظر آقای clover موافقم
فکر میکنم که فایل تکست رو ایجاد نکردید
شما با این آدرسی که به فایلتون دادین باید در دسکتاپتون یه فایل تکست ایجاد کنید و اون عددو بزنید داخلش (مثلا 13) و این error هم مربوط به همونه چون فایل رو نمیتونه پیدا کنه و اون پرینت افی که زیدینو اجرا میکنه چون فایل مساوی با ناله
موفق باشین

بانوی ایران
سه شنبه 29 دی 1388, 21:07 عصر
خیلی ممنون
درست شد نمیدونم چرا فایل خودم رو نمیخوند ولی اینجوری کار میکنه:چشمک:
حالا میشه یه سوال دیگه هم بپرسم
توی یه فایل من یه سری عدد رو اینجوری گذاشتم
2
1
2
3
4
5
6
توي اين برنامه اولين عدد تعداد سطر هاي ارايه هست (اراريه n*n+1هست)و اعداد ديگه هم مقادير ارايه دو بعدي
من يه تابع به اسمget_arrayدارم و ميخوام كه شرو ع كنه واز دومين عدد بخونه چيكار كنم كه از دومين عدد شروع به خوندن كنه؟
وديگه اينكه حلقه اي كه اعدا رو ميخونه بايد چك كنه كه يه وقت a[i][i]صفر نباشه
حالا مشكل من اينه كه اگر صفر بود چيكار كنم؟ exit(EXIT_FAILURE) بايد بزارم؟واز كاربر بخوام عدد رو عوض كنه؟

clover
سه شنبه 29 دی 1388, 22:03 عصر
چیکار کنم که از دومین عدد شروع به خوندن کنه؟
قبل از اینکه شروع به خوندن کنید این خط را اضافه کنید:

fseek(input_file, 2, SEEK_SET);
تابع fseek اشاره گر خواندن و نوشتن در فایل را در مکان مشخصی قرار میده، پارامتر اول هندل فایل مورد نظر هست، پارامتر دوم تعداد بایتهایی که اشاره گر خواندن و نوشتن باید جا به جا بشه و پارامتر سوم مکانی هست که اشاره گر باید از اونجا شروع به جا به جا شدن بکنه، این پارامتر می تونه یکی از مقادیر زیر باشه :
SEEK_CUR : از مکان فعلی اشاره گر
SEEK_END : از انتهای فایل
SEEK_SET : از ابتدای فایل
در موقع استفاده از این تابع یادتون باشه که اگر در یک فایل اعداد به این صورت قرار گرفته باشند:

1
2
3
4
5
در واقع محتویات این فایل، رشته ای به این شکل هست:

1\n2\n3\n4
پس برای رسیدن به عدد 2 باید 2 بایت جلو برید و برای رسیدن به عدد 3 باید 4 بایت به جلو برید.

حالا مشکل من اینه که اگر صفر بود چیکار کنم؟ exit(EXIT_FAILURE) باید بزارم؟
خب اگر (exit(EXIT_FAILURE بذارید که از برنامه خارج میشید و دستورات بعدی معنا نداره.

واز کاربر بخوام عدد رو عوض کنه؟
از کاربر؟ شما دارید از فایل می خونید.
اگر با برخورد به صفر احتمال روی دادن خطای مهلک در برنامه شما وجود داره و هیچ راه حلی هم برای رد کردن یا تغییر مقدار صفر وجود نداره بهتره برنامه با چاپ پیغام به کار خودش پایان بده.

بانوی ایران
سه شنبه 29 دی 1388, 22:23 عصر
قبل از اینکه شروع به خوندن کنید این خط را اضافه کنید:

fseek( input_file, 2, SEEK_SET);

خب اگر (exit(EXIT_FAILURE بذارید که از برنامه خارج میشید و دستورات بعدی معنا نداره.

از کاربر؟ شما دارید از فایل می خونید.
اگر با برخورد به صفر احتمال روی دادن خطای مهلک در برنامه شما وجود داره و هیچ راه حلی هم برای رد کردن یا تغییر مقدار صفر وجود نداره بهتره برنامه با چاپ پیغام به کار خودش پایان بده.
خيلي ممنون از توضيح كاملتون
ولی اخه اگه عددم صفر بشه بقیه برنامه هم دچار مشکل میشه
ادرس فایل اختاریه (یعنی خود کاربر میگه چه فایلی رو بخون)و من میگم به کار بر بگم برو فایل رو باز کن و عدد رو عوض کن (کار بیخودیه؟)و بعدش exit(EXIT_FAILUReمیزارم که از برنامه خارج بشه:متفکر:

clover
سه شنبه 29 دی 1388, 22:33 عصر
من میگم به کار بر بگم برو فایل رو باز کن و عدد رو عوض کن (کار بیخودیه؟)و بعدش exit(EXIT_FAILUReمیزارم که از برنامه خارج بشه
بستگی به خلاقیت شما و نیاز کاربر داره.