如何清除EOF指标?

How to clear the EOF indicator?

提问人:adch99 提问时间:12/26/2022 最后编辑:starkadch99 更新时间:12/26/2022 访问量:164

问:

我正在阅读 C 语言的文本文件。我需要从当前指针位置找到特定字符 () 的第一次出现,并将指针移动到该位置。我通过读取缓冲区,然后使用来查找字符来做到这一点。然后我寻找角色的位置。问题是,如果我将文件读入缓冲区,它将设置 EOF 指示器。即使我寻求回到字符的位置,EOF 指示器还是设置好了,并且会扰乱代码其余部分的错误处理。那么,如何确保当我在文件内容中查找时,EOF设置为false?'('strchr

int io_read_until_char(char stopchar, FILE * ifile)
{
    char row[MAXCHAR];
    int offset, read_len;
    char * loc = NULL;

    while (!feof(ifile))
    {
        if(fgets(row, MAXCHAR, ifile) == NULL)
        {
            strerror(errno);
            break;
        }
        read_len = strlen(row);
        loc = strchr(row, stopchar);
        if(loc == NULL)
            continue;
        else
        {
            offset = -read_len + (int)(loc - row);
            fseek(ifile, offset, SEEK_CUR);
            break;
        }
    }
    if(feof(ifile) && loc == NULL)
    {
        return(-1);
    }
    else if(ferror(ifile))
    {
        perror("Error in parsing stuff!\n");
        strerror(errno);
        return(-1);
    }
    else
        return(0);
}

C 文件- IO

评论

0赞 adch99 12/26/2022
@AndreasWenzel,我的代码是针对一个包含一个大矩阵的文本文件,该矩阵是不久前由该程序编写的。没有其他程序与之交互。因此,在这里使用它应该没问题。我不需要有很多安全方面的考虑,因为这段代码是用于科学计算的。
0赞 Andreas Wenzel 12/26/2022
您之前的评论是指我的答案还是我删除的评论?如果是前者,那么我建议您将该评论作为对我的回答的评论,而不是对您的问题的评论。
0赞 adch99 12/26/2022
它指的是您删除的评论。
0赞 Andreas Wenzel 12/26/2022
在我删除的评论中,我引用了这个:为什么“while( !feof(file) )”总是错的?我之所以撤回该评论,是因为我注意到在这种情况下,使用此循环条件是无害的。但是,将调用移动到循环条件会更有意义,如下所示:fgetswhile ( fgets(row, MAXCHAR, ifile) != NULL )
1赞 Andreas Wenzel 12/26/2022
请注意,该行不执行任何操作。你的意思是 在这种情况下,您可能需要考虑改用 perrorstrerror(errno);fprintf( stderr, strerror(errno) );

答:

1赞 Andreas Wenzel 12/26/2022 #1

若要清除流的文件结束指示符,可以调用函数 clearerr

但是,这样做应该不是必需的。调用函数 fseek 时,假设函数调用成功,则会自动清除文件结束指示符。