【问题标题】:writing and reading from a file in c在c中写入和读取文件
【发布时间】:2020-04-16 04:02:15
【问题描述】:

我要做的是编写 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();


}

【问题讨论】:

    标签: c function file scanf fopen


    【解决方案1】:

    这是您问题 2 的部分答案)为什么第二个函数,即 displayProduct,它给了我无限的 0 序列...?

    至少有两个问题:

    a) 为什么它是 0?

    正如@Abdullah Al Masud Tushar 已经回答的那样,正在读取的文件save.txt 的第一行是Code&lt;TAB&gt;Name&lt;TAB&gt;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 需要任意数量的非空白字符,在找到的第一个空白字符处停止。如果“name”输入中包含空格,则无法正确填写,更会混淆后面的%f

    请参阅fscanf 的手册,网址为 http://www.cplusplus.com/reference/cstdio/fscanf/ 要么 http://man7.org/linux/man-pages/man3/fscanf.3.html

    【讨论】:

      【解决方案2】:

      只需删除该行并再次运行:)

      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 函数中的上述代码应该被删除以便 line 1 不会被写入文件的原因。

      【讨论】:

      • 非常感谢...但是为什么 SaveProduct() 没有返回 1 以及这行 fprintf(f,"Code\tName\tPrice\n"); 有什么问题;
      猜你喜欢
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 2014-10-22
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多