C 使用fread时,数据打印两次
当我运行程序时,我正在使用二进制文件IO函数读取文件。最终条目打印两次C 使用fread时,数据打印两次,c,file-io,struct,fread,C,File Io,Struct,Fread,当我运行程序时,我正在使用二进制文件IO函数读取文件。最终条目打印两次 FILE *fp; struct entry temp; if (fp = fopen("recs.bin","rb")) { while (!feof(fp)) { fread(&temp,sizeof (struct entry),1,fp); printf("%s %s %s \n", temp.name ,temp.design ,temp.contact)
FILE *fp;
struct entry temp;
if (fp = fopen("recs.bin","rb"))
{
while (!feof(fp))
{
fread(&temp,sizeof (struct entry),1,fp);
printf("%s %s %s \n", temp.name ,temp.design ,temp.contact);
}
fclose(fp);
else
{
printf("\error opening file\n");
}
当我运行代码时,输出如下
Pfor.ABC Professor 9867552
Sir Blah lecturar 9237434
Miss etc Asst. Porfessor 03847363
Miss etc Asst. Porfessor 03847363
我总是得到最后一个条目两次
我试着打印beofre阅读如下
while (!feof(fp))
{
printf("%s %s %s \n", temp.name ,temp.design ,temp.contact);
fread(&temp,sizeof (struct entry),1,fp);
}
现在输出是
#gd^&!d $!du(! #$@%@22 //Some garbage values
Pfor.ABC Professor 9867552
Sir Blah lecturar 9237434
Miss etc Asst. Porfessor 03847363
现在解决了两次打印问题,但正在打印一个垃圾值
我认为这是feof(fp)中的问题,但我无法解决它。对最后一个条目的双重处理来自于使用feof,即 相反,您应该检查读取函数
fgetc
、fgets
的返回值,在您的情况下,还应该检查fread
fread
返回读取的项目数,即size
字节的块数。如果该值小于要读取的项目数,则表示读取不完整。因此:
while (fread(&temp, sizeof(struct entry), 1, fp) == 1) {
printf("%s %s %s \n", temp.name, temp.design, temp.contact);
}
只要你有一个完整的读取,打印出数据
其他人已经指出,在读取数据之前打印(未初始化的)数据会导致垃圾值。如果必须使用这样的设置,则应在循环之前至少放置一个读取。
打印beofre read read
。。你觉得怎么样??听起来是不是//一些垃圾值?检查fread
的返回值。它无法读取最后一个条目,但temp
仍然保存着旧数据。@Sourav我知道,但我试图弄清楚它是被打印了两次还是被读取了两次。在读取之前,打印让我清楚地意识到这里面有问题reading@keltar那为什么!当文件被读取时,feof()不停止进一步读取ended@SayamQazi因为它在fread和printf之后检查(失败)。