【问题标题】:Cannot find any files找不到任何文件
【发布时间】:2013-09-28 16:52:55
【问题描述】:

我刚从 C 开始。 在我的程序中,用户输入一个文件名,然后我检查该文件是否存在。

这是目前为止的代码:

    printf("Enter the file name:\n");
    char filename[50];
    fgets(filename, 50, stdin);
    printf("You have entered %s\n", filename);
    if( access(filename, F_OK ) == -1 )
    {
        printf("File not found/access denied.\n");
    }

在与程序本身相同的目录中,我得到了一个名为“steps”的文件。 但是,每当我输入步骤或 ./steps 甚至 ~/steps 时,我都会收到未找到文件的错误消息。

这里有什么问题?

顺便说一句,我在 Linux (Ubuntu) 上。 另外,我确定我可以访问该文件 - 所以这不是权限问题。

【问题讨论】:

    标签: c linux io ide


    【解决方案1】:

    fgets 在缓冲区中包含尾随的换行符,因此access 认为这是文件名的一部分。你需要去掉新线。

    在 fgets 之后,添加以下行:

    if (filename[strlen(filename)-1] == '\n') filename[strlen(filename)-1] = '\0';
    

    把它剥掉。

    编辑:正如@alk 指出的(谢谢),这应该是:

    if (strlen(filename) > 0 && filename[strlen(filename)-1] == '\n')
        filename[strlen(filename)-1] = '\0';
    

    如果左侧的计算结果为false&& 将不会计算右侧,因此不可能超出数组边界。

    【讨论】:

    • 您应该在按照建议操作之前针对0 测试strlen(filename) 的结果,否则代码可能会在访问filenameMAXSIZETst 元素时遇到未定义的行为。这也使您有机会存储结果并提供避免不必要地为同一参数多次调用昂贵的strlen() 的可能性。
    【解决方案2】:

    因为fgets() 在空字符之前添加了\n

    例如,如果您输入“abcd”,它将变为“abcd\n”

    读取文件名后,只需将\n替换为空字符

     fgets(filename, 50, stdin); 
    
     if(filename[strlen(filename)-1]=='\n')
        filename[strlen(filename)-1]='\0';
    

    【讨论】:

    • 您应该在按照建议执行之前针对0 测试strlen(filename) 的结果,否则代码可能会在访问filenameMAXSIZETst 元素时遇到未定义的行为。此外,这使您有机会存储结果并提供避免不必要地为同一参数多次调用昂贵的 strlen() 的可能性。
    • 在按照上述建议执行strlen(filename) becomes 0 之前,值得检查(strlen(filename)!=0)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    相关资源
    最近更新 更多