簡體   English   中英

在 c 中寫入和讀取文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM