如何使用EOF在C中运行文本文件?

我有一个文本文件,每一行都有字符串。我想为文本文件中的每一行增加一个数字,但是当到达文件末尾时,显然需要停止。我曾尝试过对EOF进行一些研究,但无法真正理解如何正确使用它。

我假设我需要一个while循环,但是我不确定该怎么做。


MYYA
浏览 473回答 3
3回答

慕标琳琳

如何检测EOF取决于您用来读取流的内容:function                  result on EOF or error                    --------                  ----------------------fgets()                   NULLfscanf()                  number of succesful conversions                            less than expectedfgetc()                   EOFfread()                   number of elements read                            less than expected检查输入调用的结果是否符合上述适当条件,然后调用feof()以确定结果是否是由于击中EOF或其他错误而导致的。使用fgets(): char buffer[BUFFER_SIZE]; while (fgets(buffer, sizeof buffer, stream) != NULL) {   // process buffer } if (feof(stream)) {   // hit end of file } else {   // some other error interrupted the read }使用fscanf():char buffer[BUFFER_SIZE];while (fscanf(stream, "%s", buffer) == 1) // expect 1 successful conversion{  // process buffer}if (feof(stream)) {  // hit end of file}else{  // some other error interrupted the read}使用fgetc():int c;while ((c = fgetc(stream)) != EOF){  // process c}if (feof(stream)){  // hit end of file}else{  // some other error interrupted the read}使用fread():char buffer[BUFFER_SIZE];while (fread(buffer, sizeof buffer, 1, stream) == 1) // expecting 1                                                      // element of size                                                     // BUFFER_SIZE{   // process buffer}if (feof(stream)){  // hit end of file}else{  // some other error interrupted read}请注意,所有形式都相同:检查读取操作的结果;如果失败,则检查EOF。您会看到很多示例,例如:while(!feof(stream)){  fscanf(stream, "%s", buffer);  ...}这种形式不工作的人认为它的方式,因为feof()之前将不会返回true 后,你已经尝试读取过去的文件的末尾。结果,循环执行的次数过多,这可能会或可能不会引起您的痛苦。

当年话下

一种可能的C循环是:#include <stdio.h>int main(){&nbsp; &nbsp; int c;&nbsp; &nbsp; while ((c = getchar()) != EOF)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; /*&nbsp; &nbsp; &nbsp; &nbsp; ** Do something with c, such as check against '\n'&nbsp; &nbsp; &nbsp; &nbsp; ** and increment a line counter.&nbsp; &nbsp; &nbsp; &nbsp; */&nbsp; &nbsp; }}现在,我将忽略feof和类似的功能。经验表明,在错误的时间调用它并认为尚未达到eof会对其进行两次处理非常容易。避免陷阱:char用于c的类型。getchar将下一个字符转换为unsigned char,然后返回int。这意味着在大多数[健全]平台上,EOF和的char值c不会重叠,因此您永远不会意外检测到EOF“正常” char。

叮当猫咪

从文件读取后,应检查EOF。fscanf_s&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// read from filewhile(condition)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// check EOF{&nbsp; &nbsp;fscanf_s&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// read from file}
打开App,查看更多内容
随时随地看视频慕课网APP