Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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退货<;从二进制文件读取记录时为1_C_File Io_Binaryfiles_Fread_Feof - Fatal编程技术网

C fread退货<;从二进制文件读取记录时为1

C fread退货<;从二进制文件读取记录时为1,c,file-io,binaryfiles,fread,feof,C,File Io,Binaryfiles,Fread,Feof,我试图从二进制文件中读取学生记录(SREC)。该文件确保包含至少1条完整记录(上一次运行写入该文件)。在我的输出中,我得到了两条记录的“ERROR:cannotreadrecordfromfile”语句。顶部的printf(readingrecord,numR)显示了3次,因此我知道while循环在达到eof时被输入了3次 有什么想法吗? 提前谢谢 /*Create and populate all 4 lists if lname list exists from previous usage

我试图从二进制文件中读取学生记录(SREC)。该文件确保包含至少1条完整记录(上一次运行写入该文件)。在我的输出中,我得到了两条记录的“ERROR:cannotreadrecordfromfile”语句。顶部的printf(readingrecord,numR)显示了3次,因此我知道while循环在达到eof时被输入了3次

有什么想法吗? 提前谢谢

/*Create and populate all 4 lists if lname list exists from previous usage*/
     if((readL = fopen("last", "rb")) == NULL)
     {
        printf("\nNew file will be created after server terminates.\n");
        created = 1;
     }
     else
        {           
        created = 0;

/*Read in record from binary file*/
        while(!feof(readL))
        {
            numR++;         
printf("Reading record %d\n", numR);

            /*Create new temporary SREC*/
            newSREC = (SREC*)malloc(sizeof(SREC));
            newSREC2 = (SREC*)malloc(sizeof(SREC));
            newSREC3 = (SREC*)malloc(sizeof(SREC));
            newSREC4 = (SREC*)malloc(sizeof(SREC));

            /*Read in one record from file*/
            if(fread(newSREC, sizeof(SREC), 1, readL) < 1)
            {
                newSREC2 = newSREC;
                newSREC3 = newSREC;
                newSREC4 = newSREC;

                firstL = insert(newSREC, 1, firstL);
                firstF = insert(newSREC2, 2, firstF);
                firstS = insert(newSREC3, 3, firstS);
                firstG = insert(newSREC4, 4, firstG);
            }
            else
            {
                printf("ERROR: Could not read record from file.\n");
            }
        }

        fclose(readL);
    }
/*如果以前使用过lname列表,则创建并填充所有4个列表*/
if((readL=fopen(“last”,“rb”))==NULL)
{
printf(“\n服务器终止后将创建新文件。\n”);
创建=1;
}
其他的
{           
已创建=0;
/*从二进制文件读入记录*/
而(!feof(readL))
{
numR++;
printf(“读取记录%d\n”,numR);
/*创建新的临时SREC*/
newSREC=(SREC*)malloc(sizeof(SREC));
newSREC2=(SREC*)malloc(sizeof(SREC));
newSREC3=(SREC*)malloc(sizeof(SREC));
newSREC4=(SREC*)malloc(sizeof(SREC));
/*从文件中读入一条记录*/
if(fread(新记录,sizeof(SREC),1,readL)<1)
{
newSREC2=newSREC;
newSREC3=newSREC;
newSREC4=newSREC;
firstL=插入(newSREC,1,firstL);
firstF=插入(newSREC2,2,firstF);
firstS=插入(newSREC3,3,firstS);
firstG=插入(newSREC4,4,firstG);
}
其他的
{
printf(“错误:无法从文件中读取记录。\n”);
}
}
fclose(readL);
}

EOF的错误指示器仅在尝试读取超出范围时设置

在您阅读的地方测试是否成功阅读


在您的示例中,测试是否准确读取1条记录。

来自
fread
手册页:

fread()不区分文件结尾和错误,调用方必须使用feof(3)和feror(3)来确定发生了什么

将测试更改为以下内容:

while (fread(...) > 0)
    // ...

if (ferror(file))
    // an error happened
表面问题 从表面上看,该代码的错误检测是相反的:

if (fread(newSREC, sizeof(SREC), 1, readL) < 1)
{
    newSREC2 = newSREC;
    newSREC3 = newSREC;
    newSREC4 = newSREC;

    firstL = insert(newSREC, 1, firstL);
    firstF = insert(newSREC2, 2, firstF);
    firstS = insert(newSREC3, 3, firstS);
    firstG = insert(newSREC4, 4, firstG);
}
else
{
    printf("ERROR: Could not read record from file.\n");
}

深入研究 循环不应使用
feof()
-请参阅。您应该使用以下内容:

SREC srec;
while ((fread(&srec, sizeof(srec), 1, readL) == 1)
{
    SREC *newSREC1 = malloc(sizeof(*newSREC1));
    SREC *newSREC2 = malloc(sizeof(*newSREC2));
    SREC *newSREC3 = malloc(sizeof(*newSREC3));
    SREC *newSREC4 = malloc(sizeof(*newSREC4));
    if (newSREC1 == 0 || newSREC2 == 0 || newSREC3 == 0 || newSREC4 == 0)
    {
        free(newSREC1);
        free(newSREC2);
        free(newSREC3);
        free(newSREC4);
        …report error…
        break;
    }
    *newSREC1 = srec;
    *newSREC2 = srec;
    *newSREC3 = srec;
    *newSREC4 = srec;

    firstL = insert(newSREC1, 1, firstL);
    firstF = insert(newSREC2, 2, firstF);
    firstS = insert(newSREC3, 3, firstS);
    firstG = insert(newSREC4, 4, firstG);
}

// Optional analysis of why the loop ended — feof() vs ferror() vs short read
代码会泄漏内存,就像从来没有内存不足一样。分配了
newSREC2
等之后,它会用指向
newSREC1
的指针覆盖指针。作业 应该是:

*newSREC2 = *newSREC; // Original code — see above for revision

我注意到您不能在一个数组中分配所有4条记录,因为您几乎肯定需要能够独立地释放这4条记录。这在代码中留下了大量重复。

相关:另外,.问题的可能重复不是直接的
,而(!feof(readL))
,尽管那里的注释肯定适用。
*newSREC2 = *newSREC; // Original code — see above for revision