我是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;
}
我没有得到任何输出。它一片空白。
答案 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;
}
实际上,你的代码原样(除了你已经完成的编辑之外)并不是那么错误,但它有一些小而重要的缺陷。
唯一真正的变化是: -
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上)会告诉你出了什么问题: - )
您在每次迭代中打开和关闭文件。现在这不是一个错误,而只是一个次优的东西,很可能是你不想做的事情。文件操作成本很高,打开/关闭它们需要相当多的CPU周期。你最好,为所有写入打开一次文件,为读取打开一次。 (当然,一旦可以删除写入块之后完成的fclose()和在read-block之前完成的fopen(),只需将文件指针放到文件的开头 - 留给你作为练习。
在测试时,没有人想要输入这么多数据。所以我添加了一个#define(并且使用更新的编译器也可以用const定义替换它),它定义了一个保存地址簿数组大小的宏。为了测试,我把它保持在“2”。对于生产,您可以将该值更改为“1000”,它仍然可以工作。再次,这不是一个错误,只是一个更好的风格,如果你愿意。
哦,顺便说一下,请你缩进吧。你来自Python世界吗?或者它可能是SO发布代码块所需的缩进的工件。
HTH