我正在尝试让用户输入文件的路径。然后我将获取此文件并使用fopen()打开它。以下是我目前正在尝试的示例:
char filename[80] = " ";
printf("enter filenme:");
scanf("%s",&filename);
FILE *fp=fopen(filename,"r");
我不断收到分段错误:11作为来自终端的错误。
答案 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]));
你的问题应该消失了。