这曾经工作过。我不知道我做了什么让它停止工作,但是当我输入一个不存在的文件名时,我收到一个段违规错误,程序退出。
int main()
{
File *fr;
char input_file[32];
int num_lines, valid;
do{
printf("\nEnter the name of the input file: ");
scanf("%s", input_file);
fr = fopen(input_file, "r");
if(fr == NULL){
valid = 0;
printf("File does not exist...");
}
if(fr != NULL){
fscanf(fr, "%d", &num_lines);
numbers = malloc(sizeof(int) * num_lines);
for(i=0;i<num_lines;i++){
fscanf(fr, "%[^0123456789]%d", numbers+i);
printf("%d\n", numbers[i]);
valid =1;
}
free(numbers);
fclose(fr);
}
}while(valid == 0);
}
/ edited /
答案 0 :(得分:3)
请注意以下事项:
fr = fopen(input_file, "r");
fscanf(fr, "%d", &num_lines);
if(fr == NULL){
在这里,您将结果从fopen
直接传递到fscanf
,而不首先测试文件是否已成功打开。如果无法打开文件,fr
将为NULL
,因此会出现细分错误。
尝试重新排序代码,以便在确认fscanf
之前不要执行fr != NULL
。例如:
fr = fopen(input_file, "r");
if(fr != NULL){
fscanf(fr, "%d", &num_lines);
希望这有帮助!
答案 1 :(得分:3)
嗯,这条线非常非常错误:
scanf("%s", input_file[32]);
第二个参数应该是指向字符缓冲区的指针,但是你传递的是一个字符值,它可以指向任何随机位置。它似乎可以正常工作,但它会破坏你可能因某些原因需要的内存中的一些随机点!
然后你继续将调用fopen()
的结果直接传递给fscanf()
,而不先检查它是否为空;这也不会很好。
答案 2 :(得分:1)
在检查fscanf
之前,您必须已将fr==NULL
来电移至。您需要在fr==null
检查后移动fscanf。
答案 3 :(得分:1)
在致电fr
之前,您必须检查fscanf(fr, "%d", &num_lines)
是否为空
并更改第一个scanf:scanf("%s", input_file);
答案 4 :(得分:1)
你应该检查
if(fr == NULL){
valid = 0;
printf("File does not exist...");
}
之前
fscanf(fr, "%d", &num_lines);