C语言 - fopen无效文件

6

我想知道如何使用fopen检查文件是否存在。当用户选择错误的文件名时,我希望显示一些提示信息。这应该是一些简单的检查,但我无法解决它。

谢谢

6个回答

3

在您的参数列表中:

FILE pFile ;

那么:

  pFile = fopen ("myfile.txt","r");

if (pFile == NULL)
printf("No Such File !! ");

4
这个错误信息不太好。"no such file" 只是可能的失败情况之一。 - Mat
这是唯一可能的选择,因为如果文件损坏,它不能作为程序加载,但它仍能够逐个字符(或逐行或更多)读取其内容。 - Batman
5
不,不是这样的。可能是文件或路径的权限问题,也可能是资源分配错误(fopen 可以调用 malloc,它可能会失败)。当问题完全不同的时候仅仅说“没有这个文件”是一个不好的做法,并且会使调试变得更加困难。 - Mat
其他可能的错误(来自于Linux manpage对于open的描述,这些错误也同样适用于fopen()):符号链接太多、该进程打开文件数已达到上限、路径名太长、系统打开文件数已达到上限、内核内存不足、无效的文件系统名称、文件过大。 - 12431234123412341234123
在这种情况下,使用perror()比printf()更好。 - trindflo

3
fopen失败时,它会返回NULL并设置errno来指示错误类型。
检查返回值,如果是NULL,则检查errno。您可以使用perrorstrerror等函数显示有关这些错误的简单消息。

1
为了让它更加清晰明了:
f = fopen("some-file-name.ext", "r");
if (f == NULL) reporterror();

但是,你可能不想使用fopen来检查文件是否存在和访问权限。你应该查看C库中提供的stataccess函数。两者都可以通过man手册获得。


请注意,access和stat不是C语言的一部分(它们属于POSIX)。 - Jens
@Jens - 你是对的。我记得在我工作的每个平台上都有access,但显然它不是标准。 - Duck

1

查看可能的错误以获取open的详细信息:

然而,我认为你会很难找到一种方法来确定文件名是否无效。在大多数系统上(除了Windows),任何不是过长的字符串都有可能是有效的(除了/被解释为路径分隔符之外)。


1

fopen()函数打开以参数filename指定的文件,并将其与一个流相关联,该流可以通过返回的FILE指针在将来的操作中进行识别。

FILE *try_to_open = fopen("Document.txt", "r");    //READ ONLY

如果文件成功打开,该函数将返回指向 FILE 对象的指针,该指针可用于标识未来操作中的流;否则,将返回空指针。因此,如果您想检查文件是否已正确打开,请检查指针不为空,方法如下:
if (try_to_open == NULL){
    puts("Opening file failed.");
} else {
    puts("File opened successfully.");

0
很简单:如果文件不存在,则返回的FILE*指针将为null
当然,这假定您以读取模式r打开它。

是的,但如果他没有适当的权限,它也将是“NULL”。 - Blagovest Buyukliev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接