将用户输入传递给fopen()参数c

时间:2014-10-26 22:43:14

标签: c file

我正在尝试让用户输入文件的路径。然后我将获取此文件并使用fopen()打开它。以下是我目前正在尝试的示例:

char filename[80] = " ";
printf("enter filenme:");
scanf("%s",&filename);
FILE *fp=fopen(filename,"r");

我不断收到分段错误:11作为来自终端的错误。

4 个答案:

答案 0 :(得分:2)

您正在传递文件名开头地址的地址。不要使用&amp ;.它是一个数组,因此它已经是指向存储地址的指针。

答案 1 :(得分:2)

由于您标记了此C ++,因此应考虑使用std::getline来读取文件名:

string filename;
std::cout << "Enter filename: ";
std::getline(std::cin, filename);
std::ifstream input_file(filename, std::ifstream::in);
// ... read from input_file ....

如果要将文件名读入固定大小的缓冲区,请确保在读取时指定缓冲区的长度;否则,您的程序中存在缓冲区溢出漏洞。

答案 2 :(得分:1)

虽然传递给scanf()的参数不太正确,但我认为这实际上不是问题:数组的地址和数组的第一个字符的地址是相同的。更有可能fopen()失败,您从fopen()获得一个空指针,然后您可以访问该空指针。也就是说,尝试这样的事情:

char filename[80] = {};
if (scanf("%79s", filename) != 1) {
    printf("failed to read a filename\n");
}
else if (FILE* fp = fopen(filename, "r")) {
    printf("reading file '%s'\n", filename);
}
else {
    printf("failed to open file '%s' for reading\n", filename);
}

(基于评论看起来"%79s"是将数量太多的字符限制在80个字符的数组中的正确格式,但我不是C程序员,也就是说,我可能搞砸了正确的格式...)

使用C ++的等价物可能是最好的:

std::string filename;
if (!(std::cin >> filename)) {
    std::cout << "failed to read a filename\n";
}
else if (std::ifstream in{filename}) {
    std::cout << "reading file '" << filename << "'\n";
}
else {
    std::cout << "failed to open file '" << filename << "' for reading\n";
}

答案 3 :(得分:0)

当然你会收到一个错误:你正在传递指向scanf地址而不是指针本身:

scanf("%s",&filename);

将其更改为

scanf("%s", filename);

scanf("%s",&(filename[0]));

你的问题应该消失了。