如何存储和读取文件中的数据

时间:2011-09-02 01:47:03

标签: c file

我是Linux新手。我正在尝试将数据存储到文件并将其读回。这是正确的方法吗?当我尝试编译这个时,我收到了错误。任何人都可以帮助我。提前谢谢。

 #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;
    }

我没有得到任何输出。它一片空白。

2 个答案:

答案 0 :(得分:1)

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

#include <stdio.h>

CPlusPlus.com为C提供了非常好且易于搜索的文档,因此如果您希望使用某个函数,可以查找并找出所需的标题。

答案 1 :(得分:0)

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

    #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()和在read-block之前完成的fopen(),只需将文件指针放到文件的开头 - 留给你作为练习。

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

  4. 哦,顺便说一下,请你缩进吧。你来自Python世界吗?或者它可能是SO发布代码块所需的缩进的工件。

  5. HTH