【问题标题】:C prog: Write to and from binary files not working?C 程序:写入和写入二进制文件不起作用?
【发布时间】:2012-01-16 07:15:57
【问题描述】:

我有一个关于 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 中的二进制文件处理。

提前致谢!

【问题讨论】:

  • 在使用指针之前检查fopen()是否成功!
  • 您将得到是否打开现有文件到变量finns的答案;然后您使用exists 来决定是打开文件进行读取还是写入。
  • 您有一个名为“continue”的变量——这是 C/C++ 中的保留字。
  • 对不起,我的意思是把“finns”改成“exists”,我用瑞典语写代码,但为了更清楚,我翻译了它。然后“继续”;我对那个变量还有另一个词。

标签: c list binary file-handling


【解决方案1】:

您没有正确使用freadfwrite

fread(&p, MAX, 1, fil);

应该是:

fread(&p[i], sizeof(person), 1, fil);

fwrite 呼叫也是如此。

在循环中调用freadfwrite 的另一种方法是一次性读取/写入整个数组,如下所示:

fread(&p, sizeof(person), MAX, fil);

【讨论】:

  • 哦还有一件事,我认为它会写入文件,但是当我从文件中读取然后告诉程序打印整个列表时,它会显示“列表中有 0 人”并且上面没有名字。它与读取二进制文件或打印函数有关吗?或者我必须将它添加到 for 循环中,以便它读取的每一行都将它们分类为名称、邮件和电话?
【解决方案2】:

continue 是 C/C++ 中的保留关键字 - 不要将其用作布尔变量名。

finns 未声明(假定为 bool)

您没有检查 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);
}

【讨论】:

    【解决方案3】:

    除其他外,scanf("%d", &answer) 尝试读取数字,而不是 y/n 字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      • 2017-01-26
      • 2017-02-18
      相关资源
      最近更新 更多