انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: 🇬🇧بریتانیای کبیر🇬🇧 در 27 مهر 1403، 09:21 بظ
-
در همه جا خواندم که در تابع fopen، اگه در حالت باز شدن پرونده +r یا +w بزنیم میشه هم خواند و هم نوشت ولی این اتفاق نمیفته.
چطور میشه با یک بار باز کردن پرونده هر دو کارو کرد؟
-
FILE *f;
f = fopen("/file/path","w+");
-
این رو آزمایش کردم، جواب نمیده. فقط میشه خواند ازش.
به عنوان مثال کد زیر را آزمایش کنید. باید اول در پرونده file.txt بنویسه Amin و بعد اونو در صفحه چاپ کنه ولی فقط درونه پرونده مینویسه و چاپی در کار نیست.
#include <stdio.h>
int
main (void)
{
char str [80];
FILE *fptr;
fptr = fopen ("file.txt", "w+");
fputs ("Amin", fptr);
fgets (str, 80, fptr);
fputs (str, stdout);
fclose (fptr);
return 0;
}
-
نکته اینجاست وقتی روی فایل مینویسید اشارهگر به جلو حرکت میکند.
برای اینکه بتوانید از ابتدای فایل بخوانید باید اشارهگر فایل را به ابتدای فایل برگردانید. برای اینکار میتونید از تابع fseek یا rewind استفاده کنید.
#include <stdio.h>
int
main (void)
{
char str [80];
FILE *fptr;
char *my_ptr=0;
fptr = fopen ("file.txt", "w+");
int c = fputs ("Amin\n", fptr);
printf("check write to file: %d\n", c);
// move file pointer(fptr) to beginnig
fseek(fptr, 0, SEEK_SET);
my_ptr=fgets(str, 80, fptr);
printf("check read from file: %s\n", my_ptr);
printf("read this line from file:\n%s", str);
fclose (fptr);
return 0;
}
در خواندن فایلهای متنی وقتی کار پیچیدهتر شد بهتره از تابع getline برای خواندن خط به خط محتویات فایل استفاده کنید.
و سپس از sscanf برای جدا کردن محتویات هر خط و ذخیرهٔ هر فیلد داده در متغیر مورد نظر بهره ببرید.
دستورات را خط به خط اجرا کنید و خروجی توابع IO را بررسی کنید. میتوانید نوع و مقدار بازگشتی توابع را در صفحهٔ راهنما ببینید.
man fputs
man fgets
https://stackoverflow.com/a/32366729/7508077