C程序:向二进制文件写入和从二进制文件写入不工作?
我有一个关于C编程的问题。它是关于二进制文件的。在我的代码中,我(至少想象我)让它从二进制文件读写,但出于某种原因,它不会这样做。我尝试过改变一些东西,但我在任何地方都看不到错误。正是这个最小的细节让我很难受,这是在代码完成之前剩下的全部内容,然后我就完成了程序,因此它比通常情况下更让我紧张。请指出我没有做什么,以及我应该做什么来正确读取和写入二进制文件:C程序:向二进制文件写入和从二进制文件写入不工作?,c,list,binary,file-handling,C,List,Binary,File Handling,我有一个关于C编程的问题。它是关于二进制文件的。在我的代码中,我(至少想象我)让它从二进制文件读写,但出于某种原因,它不会这样做。我尝试过改变一些东西,但我在任何地方都看不到错误。正是这个最小的细节让我很难受,这是在代码完成之前剩下的全部内容,然后我就完成了程序,因此它比通常情况下更让我紧张。请指出我没有做什么,以及我应该做什么来正确读取和写入二进制文件: #define MAX 4 //========================-STRUCTURE-=================
#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");
}
#定义最大值4
//===============================-结构-=====================================================================
结构人{
字符名[30];
字符邮件[30];
char-tele[30];
};
结构人p[MAX];
//==================================-主功能-===============================================================
int main()
{
bool continue=true,exists=false;
回答,我;
char-filnme[20];
文件*fil;
printf(“是否要打开现有文件?[y/n]:”;
scanf(“%d”和“应答”);
如果(答案=='y'|答案=='y')
{
芬兰人=真;
}
else-finns=false;
getchar();
printf(“\n\n键入要使用的文件名:”;
scanf(“%s”,filnme);
如果(存在)
{
fil=fopen(filnme,“rb”);
对于(i=0;i您没有正确使用fread
和fwrite
fread(&p, MAX, 1, fil);
应该是:
fread(&p[i], sizeof(person), 1, fil);
类似于fwrite
调用
在循环中调用fread
和fwrite
的另一种方法是一次性读取/写入整个数组,如下所示:
fread(&p, sizeof(person), MAX, fil);
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++;
}
int记录\u读取=0;
大小/数量;
计数=0;
对于(i=0;i
写循环也是如此(注意,我调整了“I”的起始值)
for(i=0;i除其他外,scanf(“%d”,&answer)尝试读取一个数字,而不是一个y/n字符。检查fopen()
在使用指针之前成功!您将得到是否将现有文件打开到变量finns
中的答案;然后使用exists
来决定是否打开该文件进行读取或写入。您有一个名为“continue”的变量-这是C/C++中的保留字。抱歉,我想将“finns”更改为“exists”,我正在用瑞典语编写代码,但为了更清楚,我对它进行了翻译。还有“继续”;我对该变量有另一个词。哦,还有一件事,我认为它会写入文件,但当我从文件中读取,然后告诉程序打印整个列表时,它会说“列表上有0个人”它上面没有名字。它可能和二进制文件的读取有关,或者可能是打印功能?或者我必须将它添加到for循环中,以便它读取的每一行都将它们排序为name、mail和telephone?
for(i=0;i<MAX;i++)
{
fwrite(&p[i], sizeof(p[i]), 1, fil);
}