C程序:向二进制文件写入和从二进制文件写入不工作?

C程序:向二进制文件写入和从二进制文件写入不工作?,c,list,binary,file-handling,C,List,Binary,File Handling,我有一个关于C编程的问题。它是关于二进制文件的。在我的代码中,我(至少想象我)让它从二进制文件读写,但出于某种原因,它不会这样做。我尝试过改变一些东西,但我在任何地方都看不到错误。正是这个最小的细节让我很难受,这是在代码完成之前剩下的全部内容,然后我就完成了程序,因此它比通常情况下更让我紧张。请指出我没有做什么,以及我应该做什么来正确读取和写入二进制文件: #define MAX 4 //========================-STRUCTURE-=================

我有一个关于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");

}
#定义最大值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);
}