【问题标题】:C - fopen invalid fileC - fopen 无效文件
【发布时间】:2011-04-10 14:02:19
【问题描述】:

我想知道,如何检查我是否打开了 fopen 存在的文件?当用户选择名称错误的文件时,我想显示一些消息。一定是一些简单的检查,但我无法解决。

谢谢

【问题讨论】:

    标签: c fopen


    【解决方案1】:

    在您的参数列表中:

    FILE pFile ;
    

    然后:

      pFile = fopen ("myfile.txt","r");
    
    if (pFile == NULL)
    printf("No Such File !! ");
    

    【讨论】:

    • 这根本不是一个好的错误信息。 “没有这样的文件”只是可能的故障之一。
    • 这是唯一可能的选项,因为如果文件损坏,他将不会作为程序加载,但他将能够逐个字符(或行或更多)读取其字符。跨度>
    • 不,不是。这可能是文件或路径的权限问题。这也可能是资源分配错误(fopen 可以调用malloc,这可能会失败)。当问题可能完全不同时说“没有这样的文件”是不好的做法,并且会使调试更加困难。
    • 其他可能的错误(来自open 的 linux 手册页,fopen() 也可能出现错误):符号链接过多,已达到此进程的最大打开文件数,路径名太long, 已达到系统打开的最大文件数,内核内存不足,文件系统名称无效,文件太大。
    【解决方案2】:

    fopen失败时,它返回NULL并设置errno来指示错误的类型。

    检查返回值,如果是NULL,检查errno。您可以使用 perrorstrerror 之类的函数来显示有关这些错误的简单消息。

    【讨论】:

      【解决方案3】:

      为了更清楚:

      f = fopen("some-file-name.ext", "r");
      if (f == NULL) reporterror();
      

      但是,您可能不想使用fopen 来检查存在和访问权限。你应该看看stataccess。都可以在 C 库中使用,也可以使用 man

      【讨论】:

      • 请注意,access 和 stat 不是 C(它们是 POSIX)。
      • @Jens - 你是对的。我记得在我工作的每个平台上都有访问权限,但显然不是标准的。
      【解决方案4】:

      the possible errorsopen

      但是,我认为您将很难找到确定文件名无效的方法。在大多数系统(Windows 除外)上,任何不太长的字符串都可能有效(模 / 被解释为路径分隔符)。

      【讨论】:

        【解决方案5】:

        fopen() 函数打开参数文件名中指定名称的文件,并将其与一个流相关联,该流可以在以后的操作中通过返回的 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.");
        

        【讨论】:

          【解决方案6】:

          很简单:如果文件不存在,则返回的FILE* 指针将为null

          当然,这假设您以r 阅读模式打开它。

          【讨论】:

          • 是的,但如果他没有适当的权限,例如NULL 也是如此。
          猜你喜欢
          • 1970-01-01
          • 2019-05-10
          • 2011-05-02
          • 1970-01-01
          • 1970-01-01
          • 2014-06-27
          • 1970-01-01
          • 2015-07-28
          • 1970-01-01
          相关资源
          最近更新 更多