在C语言中,使用fopen函数会返回无效参数。

8

我在论坛上搜索了一下,但是没有找到解决这个问题的答案。看起来这是一个普遍存在的问题,但是提到的解决方案都不适用。

以下是我打开文件的代码:

#include <stdio.h>
#include <string.h>

void main() {
    FILE *input;
    char path[200];

    printf("Enter the full file path and file name in the following format:"
        "\nC:\\Users\\Username\\etc......\\filename.extension\n");
    fgets(path, 200, stdin);
    printf("%s",path);
    input=fopen(path,"r");
    if (input==NULL) {
        perror("The following errors were encountered");
        return(-1);
    }
}

printf(%s, path) 可以正确地显示我想要打开的文件的路径和名称,但是 fopen 总是返回无效参数。我也尝试使用指向路径的指针在 fopen 中,但这总是导致程序崩溃。


10
这是因为 path 变量会包含一个换行符(\n)作为结尾... - isedev
5
顺便提一句:当主函数声明为void时,你返回了一个值“-1”。不要这样做。将main声明为int类型,并从所有代码路径返回一个值。虽然这不是一个致命错误,但却是不良的编程风格。 - jpw
1
在声明返回void的函数中使用return VALUE,如果我没记错的话,足以导致编译器直接拒绝程序。(我在这台电脑上没有我的标准副本。) - zwol
1
即使main正确声明为返回int,也不应该返回负值,因为这些值是保留给操作系统的。如果没有充分的理由去做其他事情,应该使用#include <stdlib.h>并返回EXIT_SUCCESSEXIT_FAILURE(在其中定义为0和1)。 - 5gon12eder
1
@5gon12eder 有趣的事实,你可能不知道:根据C标准,EXIT_SUCCESSEXIT_FAILURE并没有规定要具有特定的值。然而,从main函数返回数字零所产生的效果必须与返回EXIT_SUCCESS相同! - zwol
显示剩余5条评论
2个回答

8

您正在使用fgets获取path\nfgets视为有效字符。 您需要手动删除它。

fgets(path, 200, stdin);
path[strlen(path) - 1] = '\0';

这可能还不够;fgets 可能会返回一个以 \r\n 结尾的行(虽然它不应该,但一些旧的 C 库仍然会这样做),或者用户可能会意外地输入尾随空格。 - zwol
1
path[strlen(path) - 1] - Armen Tsirunyan
1
@Zack 或者它可能返回NULL,表示失败。 - Deduplicator
确实,正如Zach所说,这可能还不够,但它告诉了我所有我需要知道的东西。谢谢!我可能最终会使用strrchr来去除尾随字符。 - Dominic Mason
由于某些原因,我必须使用NULL而不是'\0'来使其工作。 - Dominic Mason

6
您的问题可能是由于fgets在返回输入行之前未删除末尾的'\n'fopen可以愉快地尝试打开文件名包含'\n'的文件,但是(假设您使用的是Windows),操作系统不允许文件名包含该字符,这就是为什么会出现“无效参数”消息的原因。 在Unix类型的系统上,内核对文件名的约束要少得多,您将得到“没有此类文件或目录”的结果。 这可能是为什么您没有找到此问题的先前答案的原因; 我知道我以前见过变化。

请尝试以下操作:

...
fgets(path, 200, stdin);
char *p = path + strlen(path) - 1;
while (isspace(*p)) p--;
*(p+1) = '\0';
printf("%s\n", path);
input = fopen(path, "r");
...

您需要使用#include <ctype.h>来调用isspace函数。

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