Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用fread时,数据打印两次_C_File Io_Struct_Fread - Fatal编程技术网

C 使用fread时,数据打印两次

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)

当我运行程序时,我正在使用二进制文件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);
    }
    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之后检查(失败)。