【问题标题】:how to store and read data from files如何存储和读取文件中的数据
【发布时间】:2011-09-02 01:47:03
【问题描述】:

我是 linux 中的 C 新手。我正在尝试将数据存储到文件中并将它们读回。这是正确的方法吗。当我尝试编译这个时,我得到了错误。谁能帮助我。提前致谢。

 #include<stdio.h>
       typedef struct
    {
      int select;
      char lastname[25];
      char firstname[25];
      char address[25];
      char phonenumber[25];
    } addressbook;

    addressbook a[5];
     FILE *fp;
    int main()
    {
      int i;

     for( i=0; i<5 ; i++)
    {
     printf("enter details\n");
       printf("enter lastname:\n");
       scanf("%s", a[i].lastname);
       printf("enter firstname:\n");
       scanf("%s", a[i].firstname);
       printf("enter address:\n");
       scanf("%s", a[i].address);
       printf("enter phone number:\n");
       scanf("%s", a[i].phonenumber);
      fp = fopen("addressbook.dat","a+");
      fwrite(&a, sizeof(a), 1, fp);
      fclose(fp);
    }

    for(i=0; i<5; i++)
    {
      fopen("addressbook.dat", "r");
      fread(&a, sizeof(a), 1, fp );
      printf("lastname:%s\n", a[i].lastname);
      printf("firstname:%s\n", a[i].firstname);
      printf("address:%s\n", a[i].address);
      printf("phonenumber:%s\n", a[i].phonenumber);
      fclose(fp);
    }
    return 0;
    }

我没有得到任何输出。它是空白的。

【问题讨论】:

  • 如果您发布了错误......也许有人可以提供帮助。
  • 当然...发布您尝试编译的实际代码。如果上面是它......好吧,是的,那不是完整的代码。
  • 根据编译器消息,这可能是完整的代码...似乎没有包含标题,不是吗?
  • 我已经编辑了代码,现在我没有收到错误。但是输出是空白的。这是从文件写入和读取的正确方法吗?请帮我。谢谢。

标签: c file


【解决方案1】:

查看此代码,让我向您解释您的代码中的所有错误。

    #include<stdio.h>

    typedef struct
    {
          int select;
          char lastname[25];
          char firstname[25];
          char address[25];
          char phonenumber[25];
    } addressbook;

    #define ARRAYLEN 2

    addressbook a[ARRAYLEN];
    FILE *fp;

    int main()
    {
         int i;

         fp = fopen("addressbook.dat","a+");

         for( i=0; i<ARRAYLEN ; i++)
         {
           printf("enter details\n");
           printf("enter lastname:\n");
           scanf("%s", a[i].lastname);
           printf("enter firstname:\n");
           scanf("%s", a[i].firstname);
           printf("enter address:\n");
           scanf("%s", a[i].address);
           printf("enter phone number:\n");
           scanf("%s", a[i].phonenumber);
           fwrite(&a[i], sizeof(a), 1, fp); /* notice, array indexed */
        }
        fclose(fp);

        fopen("addressbook.dat", "r");
        for(i=0; i<ARRAYLEN; i++)
        {
          fread(&a[i], sizeof(a), 1, fp );
          printf("lastname:%s\n", a[i].lastname);
          printf("firstname:%s\n", a[i].firstname);
          printf("address:%s\n", a[i].address);
          printf("phonenumber:%s\n", a[i].phonenumber);
        }
        fclose(fp);

        return 0;
    }

实际上,您的代码原样(除了您已经完成的编辑)并没有那么不正确,但它有一些小而关键的缺陷。

  1. 唯一真正的变化是:-

    fwrite(&a[i],...
    

    和,

    fread(&a[i],...
    

    即传递您要写入的特定数组元素的地址,而不是整个数组。此外,即使您传递了整个数组的地址,也没有。您要求库写入的字节/字符只是 sizeof(thestructure),所以基本上剩下的被截断了。没有它,你写入文件的内容就像......

    A          <-- file contents after, first iteration
    AAB        <-- file contents after, second iteration
    AABABC     <-- file contents after, third iteration
    AABABCABCD <-- file contents after, fourth iteration
    ....
    

    我想你会从中找出问题所在。您的 addressbook.dat 的内容也是文本,所以一个简单的“cat addressbook.dat”(在 Linux 上)会告诉你出了什么问题:-)

  2. 您在每次迭代中都打开和关闭文件。现在这不是错误,而只是次优的事情,很可能是您不想做的事情。文件操作成本很高,打开/关闭这些操作会花费相当多的 CPU 周期。您最好为所有写入打开文件一次,为读取打开一次。 (当然,一旦将文件指针指向文件的开头,就可以删除在写块之后完成的 fclose() 和在读块之前完成的 fopen() ——留给你作为练习)。

  3. 在测试时,没有人愿意输入这么多数据。所以我添加了一个#define(并且使用较新的编译器,您也可以将其替换为 const 定义),它定义了一个包含地址簿数组大小的宏。为了测试,我将其保持在“2”。对于生产,您只需将该值更改为“1000”,它仍然可以工作。同样,这不是错误,只是一种更好的风格,如果你愿意的话。

  4. 哦,顺便说一句,请正确缩进。你来自 Python 世界吗?或者它可能是 SO 发布代码块所需的缩进的产物。

HTH

【讨论】:

  • 非常感谢。我正在学习 linux 编程,因为我正在学习 C 语言。您是否编译了此程序并检查了输出。当我尝试这个时,我没有得到正确的输出。
  • 是的,我发布的代码段确实可以编译,或者应该编译,除非我犯了一些讨厌的剪切粘贴错误:)
【解决方案2】:

在我看来,您没有包含所需的标题。例如,printf 需要 stdio.h,因此在文件的开头,您将需要

#include <stdio.h>

CPlusPlus.com 提供了相当不错且易于搜索的 C 文档,因此如果您想使用某个函数,可以查找它并找出需要哪个标头。

【讨论】:

  • 谢谢。我已经包括了它。程序正在运行,但我没有得到任何输出。
猜你喜欢
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多