首页 > 解决方案 > 从二进制文件中读取简单结构并在 c 中在屏幕上显示特定数据

问题描述

我是编程新手,我正在编写我的第一个项目。我的部分项目需要询问用户的日期、月份和年份;在文件中写入注释,然后在屏幕上显示对应的月份和年份注释。这是我的笔记结构:

typedef struct event{
    int day;
    int month;
    int year;
    char title[20];
    char text[400];
} Note;

这是与输入相关的部分:

fptr = fopen("note.bin","wb");
printf("\n\n\t\tAdd title:\n");
fgets(tempNote.title, 20, stdin);
fwrite(&tempNote.title, sizeof(tempNote.title), 1, fptr);
fseek(fptr, sizeof(Note), SEEK_CUR);
printf("\n\n\t\tAdd your note:\n");
fgets(tempNote.text, 400, stdin);
fwrite(&tempNote.text, sizeof(tempNote.text), 1, fptr);
fclose(fptr);

最后是负责根据给定月份和年份读取和显示数据的部分:

fptr = fopen("note.bin","rb");
int len = 0;
while(1)
{
    fread(&tempNote, sizeof(Note), 1, fptr);
    if(feof(fptr) != 0) break;
    if(tempNote.month == month && tempNote.year == year)
    {
        len++;
    }
}
fclose(fptr);
for( int i = 0; i <= len ; i++)
{
    printf("\nYOUR NOTE %d\n",i);
    printf("%d\t%d\t%d\t%s\t%s",noteCollection[i].day, noteCollection[i].month, noteCollection[i].year, noteCollection[i].title, noteCollection[i].text);
}

一旦我运行程序,最后的输出会显示一些类似垃圾的数据。我尝试阅读相同的问题,但到目前为止,我还没有设法解决这个问题。那么我错过了什么?

标签: cstructurebinaryfilesfwritefread

解决方案


你的输出函数做了一些奇怪的事情:

fwrite(&tempNote.title, sizeof(tempNote.title), 1, fptr);
fseek(fptr, sizeof(Note), SEEK_CUR);
fwrite(&tempNote.text, sizeof(tempNote.text), 1, fptr);

fseek()写完之后就不需要了。相反,我要做的是先填充整个tempNote内容,然后一次全部写入:

fwrite(&tempNote, sizeof(tempNote), 1, fptr);

然后在读回它时,您可以一次读取整个结构(或者可能重复读取直到到达文件末尾)。


推荐阅读