使用 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) {
...
}
有没有办法把调用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) {
...
}