我有一个关于C编程的问题。它涉及二进制文件。在我的代码中我(至少想象我)使它从二进制文件读取和写入,但由于某种原因它不会这样做我尝试过改变一些东西,但我只是在任何地方都没有看到错误。而这正是这个最小的细节给了我一个艰难的时刻,在这个代码完成之前还剩下要做的就是然后我完全完成了这个程序,所以它比平常更让我神经紧张。请指出我没做什么以及我应该做些什么才能让它读取和写入二进制文件正确:
#define MAX 4
//========================-STRUCTURE-=====================================================================
struct person{
char name[30];
char mail[30];
char tele[30];
};
struct person p[MAX];
//========================-MAIN FUNCT-===============================================================
int main()
{
bool continue=true,exists=false;
int answer,i;
char filnme[20];
FILE *fil;
printf("Would you like to open an already existing file?[y/n]: ");
scanf("%d",&answer);
if(answer=='y'||answer=='Y')
{
finns=true;
}
else finns=false;
getchar();
printf("\n\nType the name of the file you will use: ");
scanf("%s",filnme);
if(exists)
{
fil = fopen(filnme,"rb");
for(i=0;i<MAX;i++)
{
while(feof(fil)==0)
{
fread(&p, MAX, 1, fil);
printf("%s %s %s\n",p.name,p.mail,p.tele);
}
}
fclose(fil);
}
else fil = fopen(filnme,"wb");
do
{
system("cls");
int choice;
printf("What would you like to do?");
printf("\n_______________\n");
printf("1. Add another person to the list\n");
printf("2. Print the entire list\n");
printf("3. Remove information from the list\n");
printf("4. Sort\n");
printf("5. Change information\n");
printf("6. Search\n");
printf("7. Exit\n");
printf("\nChoice: ");
scanf("%d",&choice);
printf("\n");
system("cls");
switch(choice)
{
case 1:
addtolist();
getch();
break;
case 2:
write();
getch();
break;
case 3:
remove();
getch();
break;
case 4:
sort();
getch();
break;
case 5:
change();
getch();
break;
case 6:
search();
getch();
break;
case 7:
continue=false;
break;
default:
printf("Not a valid choice!");
getch();
break;
}
}while(continue);
for(i=1;i<=MAX;i++)
{
fwrite(&p, MAX, 1, fil);
}
fclose(fil);
system("cls");
}
没关系函数的声明等,我已经覆盖了,只是我放入main中的二进制文件处理。
提前致谢!
答案 0 :(得分:2)
您没有正确使用fread
和fwrite
。
fread(&p, MAX, 1, fil);
应该是:
fread(&p[i], sizeof(person), 1, fil);
同样适用于fwrite
来电。
在循环中调用fread
和fwrite
的替代方法是一次读取/写入整个数组,如下所示:
fread(&p, sizeof(person), MAX, fil);
答案 1 :(得分:0)
continue是C / C ++中的保留关键字 - 不要将其用作布尔变量名。
未宣布芬兰人(假设是布尔)
您没有检查fopen的返回值。你怎么知道文件是否成功打开了?
你在fread上的while循环看起来并不合适。
这看起来好多了
int records_read = 0;
size_t count;
count = 0;
for (i = 0; i < MAX; i++)
{
count = fread(&p[i], sizeof(p[i]), 1, fil);
if (count == 0)
{
break;
}
records_read++;
}
你的写循环相同(注意我调整了“i”的起始值)
for(i=0;i<MAX;i++)
{
fwrite(&p[i], sizeof(p[i]), 1, fil);
}
答案 2 :(得分:0)
除了其他内容外,scanf(“%d”和&amp; answer)会尝试读取一个数字,而不是一个y / n字符。