使用 "fread" 获得意外输出

Getting unexpected output using "fread"

谁能帮我解决下面的代码?

#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *fp;
    char another= 'Y';
    struct emp
    {
        char name[14];
        int age;
        float bs;
    }e;
    fp = fopen("Employee.DAT", "wb");
        if (fp == NULL)
    {
        printf("Cannot open file");
        exit(1);
    }
    while (another == 'Y')
    {
        printf("\nEnter name, age and basic salary:");
        scanf("%s %d %f", e.name, &e.age, &e.bs);
        fwrite(&e, sizeof(e), 1, fp);
        printf("Add another record?(Y/N)");

        another=_getche();
    }
    fclose(fp);
    return 0;
}

我正在尝试输入以下内容:
Abc 19 11111 Def 20 22222 Ghi 21 33333
下面代码的输出应该作为上面代码的输入,但我得到下面的输出如下图所示:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *fp;
    struct emp
    {
        char name[14];
        int age;
        float bs;
    }e;
    fp = fopen("Employee.dat", "rb");
    if (fp == NULL)
    {
        printf("Cannot open file");
        exit(1);
    }
    while (fread(&e, sizeof(e), 1, fp) == 1);
    printf("%s %d %f\n", e.name, e.age, e.bs);
    fclose(fp);
    return 0;
}

我认为问题出在 "fread" 但我无法找出问题所在。

while (fread(&e, sizeof(e), 1, fp) == 1);
printf("%s %d %f\n", e.name, e.age, e.bs);
fclose(fp);

您的打印语句在 while 循环之外,因此它只会打印最后读取的信息(或者无效,如果没有调用 fread 成功)。

缩进和块有助于编写正确的代码:

while (fread(&e, sizeof(e), 1, fp) == 1) {
  printf("%s %d %f\n", e.name, e.age, e.bs);
}
fclose(fp);

另请注意,这不是序列化数据的好方法或可靠方法。结构的布局(甚至是部分,寻找字节顺序)可能会在不同的编译器和体系结构之间发生变化。


另外,你应该在其他代码中写入后关闭文件。

请去掉 while 语句后的分号:

while (fread(&e, sizeof(e), 1, fp) == 1) {
  printf("%s %d %f\n", e.name, e.age, e.bs);
}
fclose(fp);

使用分号,循环遍历所有记录并在没有更多记录时停止。现在 printf() 从文件中打印最近(最后)读取记录的详细信息。

代码的实际行为如下:

while (fread(&e, sizeof(e), 1, fp) == 1)
    ;    
printf("%s %d %f\n", e.name, e.age, e.bs);
fclose(fp);

另外,写入记录后请尽快关闭文件

 while (fread(&e, sizeof(e), 1, fp) == 1);
 printf("%s %d %f\n", e.name, e.age, e.bs);

printf 语句应该在 while 循环中。在 while 之后删除 ;fread 将读取直到 end of file 直到最后一条记录,并且 printf 在循环之后将打印最后一条记录。

while (fread(&e, sizeof(e), 1, fp) == 1);

从循环中删除该分号,您就完成了!!!!