为什么在使用用户输入获取文件名时出现分段错误?
Why do I get a segmentation fault when getting file name using user input?
我会将代码精简到只有我遇到问题的部分。
当我执行以下操作时,代码有效
int main() {
FILE * fptr1 = fopen("in.txt", "r");
fread(data, sizeof(char), size, fptr1);
.
.
.
FILE * fptr2 = fopen("out.txt", "w");
fwrite(data, sizeof(char), size, fptr2);
fclose(fptr2);
}
但是当我使用 fgets 或 scanf 获取输入和输出文件名时,出现分段错误。
int main() {
char inputfile[100];
char outputfile[100];
printf("name of input file: \n");
fgets(inputfile, 100, stdin);
printf("name of output file: \n");
fgets(outputfile, 100, stdin);
.
.
.
}
我已经研究了一段时间了。我尝试使用 scanf 并尝试更改输入文件和输出文件的分配大小,但我不断收到:
Segmentation fault (core dumped)
使用 fgets()
,生成的文件名 inputfile
和 outputfile
包含终止换行符。它导致以下 fopen()
失败并返回 NULL
。
但是,您在调用 fread()
或 fwrite()
之前没有检查 FILE*
的无效性,这导致了分段错误。
使用fgets()
输入的字符串包含终止'\n',这通常是意外的。虽然这不会直接导致段错误,但它可能会导致 fopen()
到 return NULL
,因为它找不到该文件。尝试从空文件指针读取数据将导致段错误。
添加
if(fptr1 == 0)
{
perror("fopen()");
exit(EXIT_FAILURE);
}
在你的 fopen()
声明之后。
我会将代码精简到只有我遇到问题的部分。
当我执行以下操作时,代码有效
int main() {
FILE * fptr1 = fopen("in.txt", "r");
fread(data, sizeof(char), size, fptr1);
.
.
.
FILE * fptr2 = fopen("out.txt", "w");
fwrite(data, sizeof(char), size, fptr2);
fclose(fptr2);
}
但是当我使用 fgets 或 scanf 获取输入和输出文件名时,出现分段错误。
int main() {
char inputfile[100];
char outputfile[100];
printf("name of input file: \n");
fgets(inputfile, 100, stdin);
printf("name of output file: \n");
fgets(outputfile, 100, stdin);
.
.
.
}
我已经研究了一段时间了。我尝试使用 scanf 并尝试更改输入文件和输出文件的分配大小,但我不断收到:
Segmentation fault (core dumped)
使用 fgets()
,生成的文件名 inputfile
和 outputfile
包含终止换行符。它导致以下 fopen()
失败并返回 NULL
。
但是,您在调用 fread()
或 fwrite()
之前没有检查 FILE*
的无效性,这导致了分段错误。
使用fgets()
输入的字符串包含终止'\n',这通常是意外的。虽然这不会直接导致段错误,但它可能会导致 fopen()
到 return NULL
,因为它找不到该文件。尝试从空文件指针读取数据将导致段错误。
添加
if(fptr1 == 0)
{
perror("fopen()");
exit(EXIT_FAILURE);
}
在你的 fopen()
声明之后。