使用 fgets 后有没有办法后退一行?

Is there a way to move back a line after using fgets?

有没有办法把调用fgets后刚刚读取的那行移回原处?我知道当您使用 fgetc 时,您可以使用 ungetc。有什么方法可以为 fgets 做类似的事情吗?

我问这个的原因是因为我在 if 语句中有一个 fgets 而我不希望 fgets 被实际执行我只是想知道它是否会 return一个NULL还是不行。但我知道,如果 fgets 在 if 语句中,它将被执行。这就是为什么我想知道如何将它移回调用 fgets 之前文件中的点。

没有真菌。

可以 使用 ftell 在输入流中保存一个位置,然后使用 fseek 重新定位到该点。它对文件有用,但不能从终端(即标准输入)读取。

进一步阅读

使用ftell 并存储位置。使用 fseek,您可以在需要时设置它。

虽然您可以搜索换行符或文件开头,但保存位置更容易编码。

不,没有。 POSIX 标准只保证一个字节的回推。

不清楚你为什么要这样做,但如果你想检查你是否已经到达文件末尾,正确的做法是测试 fgetc 的结果是否与EOF(然后做 ungetc)。仅在流上调用 feof 是不够的,因为只有在读取操作无法读取更多字节时才会设置文件结束位。

int c = ungetc(fgetc(f), f); // peek one byte
if (c == EOF) {
    ...
}