使用 "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);
从循环中删除该分号,您就完成了!!!!
谁能帮我解决下面的代码?
#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);
从循环中删除该分号,您就完成了!!!!