[英]writing and reading from a file in c
我想要做的是編寫 2 個函數:一個寫入文件的函數和一個讀取同一文件的函數……我面臨兩個問題:1-當我同時執行這兩個函數時:第一個函數工作幾乎正確,但沒有返回 1 ; 第二個函數正確讀取我的文件,但在無限系列的 0 之后它給了我。 2-當我只執行第二個函數(讀取)時,它給了我無限系列的 0,它沒有讀取我在文件中的內容。
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
struct Product
{
int Code;
char Name[30];
float Price;
};
struct Product p[15];
int SaveProduct(int n) // n number of product
{
int i;
FILE *f;
if((f=fopen("save.txt","w"))==NULL)
{
return 0;
}
else{
fprintf(f,"Code\tName\tPrice\n");
for(i=0;i<n;i++)
{
printf("enter Code,Name,Price\n");
scanf("%d %s %f",&p[i].Code, p[i].Name,&p[i].Price);
fprintf(f,"%d \t %s\t %.2f\n",p[i].Code, p[i].Name,p[i].Price);
}
fclose(f);
return 1;
}
}
void displayProduct()
{
FILE *f;
if ( (f=fopen("save.txt","r"))==NULL )
{
printf("error");
}
else
{int i=0;
printf("Code\tName\tPrice\n");
while(fscanf(f,"%d %s %f",&p[i].Code,p[i].Name,&p[i].Price) != EOF)
{
printf("%d\t %s\t %.2f\n",p[i].Code,p[i].Name,p[i].Price);
i++;
}
fclose(f);
}
}
int main()
{
SaveProduct(3); //3 number of product
displayProduct();
}
這是對您的問題 2) 的部分答案) 為什么第二個函數,即displayProduct
,它給了我無限系列的 0...?
至少有兩個問題:
a) 為什么它是 0?
正如@Abdullah Al Masud Tushar 已經回答的那樣,正在讀取的文件save.txt
的第一行是Code<TAB>Name<TAB>Price
,而fscanf
的格式字符串是"%d %s %f"
。 %d
期待:
任意數量的十進制數字 (0-9),可選地前面有一個符號(+ 或 -)。
但是滿足'C',然后fscanf
停止而不填充任何項目並返回,保持項目不變。 而且,您的結構數組p
是全局變量,並被初始化為全零。
b) 為什么是無限的? fscanf
返回正常填充成功的項目數; 僅當發生錯誤或在任何數據可以成功讀取之前到達文件結尾時,它才返回 EOF。
在您的情況下,由於問題 a) 的原因,返回零並且條件fscanf(...) != EOF
始終為真。
成功時,該函數返回成功填充的參數列表的項目數。 由於匹配失敗、讀取錯誤或到達文件末尾,此計數可能與預期的項目數匹配或更少(甚至為零)。
如果在讀取時發生讀取錯誤或到達文件末尾,則會設置正確的指示符(feof 或 ferror)。 並且,如果在任何數據可以成功讀取之前發生任何一種情況,則返回 EOF 。
同樣, fscanf
還存在一些其他問題:
c) 在文件中, '\\t'
用作字段分隔符(寫入時)但在fscanf
格式字符串中使用空格( ' '
),因此需要空格。
d) %s
需要任意數量的非空白字符,在找到的第一個空白字符處停止。 如果“名稱”輸入包含空格,則無法正確填充,更何況會混淆后面的%f
。
請參閱http://www.cplusplus.com/reference/cstdio/fscanf/或http://man7.org/linux/man-pages/man3/fscanf.3.html 上的fscanf
手冊
只需刪除該行並再次運行:)
fprintf(f,"Code\tName\tPrice\n");
上面的行導致輸出到 save.txt 文件,如下所示 -
Code Name Price // line 1
123 aa 10 // line 2
456 bb 20 // line 3
789 cc 30 // line 4
當程序讀取文件時
fscanf(f,"%d %s %f",&p[i].Code,p[i].Name,&p[i].Price)
第 1 行的輸入錯誤。 這就是為什么應該被刪除從SaveProduct功能上面的代碼,使1號線沒有得到文件中writen。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.