Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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 达到EOF后读取文件_C - Fatal编程技术网

C 达到EOF后读取文件

C 达到EOF后读取文件,c,C,代码段在while循环后有一个EOF,之后必须重新打开该文件-重新使用fopen。我的问题是,是否有办法避免这种笨拙的fopen重复使用,或者以某种方式不使用EOF if (!(f=fopen("D:\\C\\Test.txt", "r"))) { printf("File not existing\n"); } while ((next=fgetc(f))!=EOF){ if (next=='1') num++; } pri

代码段在while循环后有一个EOF,之后必须重新打开该文件-重新使用fopen。我的问题是,是否有办法避免这种笨拙的fopen重复使用,或者以某种方式不使用EOF

if (!(f=fopen("D:\\C\\Test.txt", "r"))) 
        {   
          printf("File not existing\n");
        }
while ((next=fgetc(f))!=EOF){
    if (next=='1') num++;
}

printf("%d\n", num);

  f=fopen("D:\\C\\Test.txt", "r");
   while (fgets(buf, 1000, f)!=NULL)
            printf("%s", buf);
希望我足够清楚。

使用倒带(f)功能。 它会将文件指针重置回磁头,所以在rewind()之后的文件与第一次fopen()之后的文件相同。
有关详细信息,请参见:

首先,如果重新打开,则应在重新打开前执行
fclose()
。如果您不这样做,您就是在“泄漏”计算机资源—您有一个无法访问的打开文件流

第二,您可以直接打开文件的开头,也可以直接打开文件,而无需重新打开文件:

fseek(f, 0L, SEEK_SET);
rewind(f);
您还应该注意,如图所示的代码报告它在第一次打开文件时失败,但继续使用该文件,就像它成功一样。这不太可能带来幸福。您还应该检查第二次打开是否成功(如果重新打开)。仅仅因为文件在一秒钟前就在那里并不意味着它还在那里(尽管失败的可能性很小,我同意你)。

a)
fseek
从头开始


b) 在重新打开之前关闭文件

您可以查看开头的.Tnx以进行回复,使用“倒带”并解决问题。我发现它现在开得不好。我该如何解决这个问题呢?如果文件没有打开,可能是文件名有问题。你在一台Windows机器上;显然,您有一个
D:
驱动器,其中包含用于C项目的文件夹
D:\\C
。文件
Test.txt
是否确实存在于该文件夹中?你有运行它的权限吗?您似乎有足够的反斜杠,但Windows API(但不是
cmd.exe
程序和等效程序)接受
/
(斜杠)作为
\
(反斜杠)的同义词。是的,文件存在,我可以完全控制它。如果
fopen()
无法打开它,那么要么程序中的名称错误,要么磁盘上的文件有问题。您可能可以从
)和
strerror()
(从
)中找到有关错误的更多信息。但是,基本上,如果文件没有打开,程序或文件名都会出现问题-请选择,但我们无法轻松地为您远程解决。可以考虑将文件名传递为命令行参数,并打开命令行上指定的文件。这允许您在不重新编译的情况下测试替代名称。