我正在尝试使用C语言中的文件。当我通过命令行输入文件名时,它可以工作,但是当我尝试在标准输入上输入文件名时,它不起作用。这是我的代码:
int main()
{
FILE * input;
char fileName[100];
printf("Enter file name\n");
scanf("%c",fileName);
input=fopen(fileName,"r");
readData(input);
return 0;
}
我按此运行此代码 -
gcc temp.c -o exe
./exe
Enter file Name
input.txt
这会出现此错误:
File not found or unable to read
Segmentation fault (core dumped)
但这有效:
int main(int argc,char *argv[])
{
FILE * input;
input=fopen(argv[1],"r");
readData(input);
return 0;
}
我运行这样的代码:
gcc temp.c -o exe
/exe input.txt
为什么第一个出错?
答案 0 :(得分:3)
注意这一行
scanf("%c", fileName);
%c
格式字符串只接受单个字符。要读取整个字符串,请使用%s
格式字符串。
答案 1 :(得分:1)
scanf("%c",fileName);
读取1 char
并将其保存到fileaName
。此时,fileaName
只是char
的数组,其第一个char
已初始化。它不是字符串:char
的数组,包括终止'\0'
。
fopen(fileName,"r");
期望fileName
中有一个字符串,但该变量未正确填充。因此错误"文件未找到或无法读取
分段错误(核心转储)"
使用scanf("%99s",fileName);
这将1)跳过像' '
这样的前导空格,然后2)将最多99个非空格char
保存到fileName
,最后添加'\0'
。 99非常重要,因为不会溢出fileName[100]
。
答案 2 :(得分:0)
首先
scanf("%c",fileName);
你尝试阅读单个字符。尝试
scanf("%s",fileName);
还使用nulls初始化数组
char fileName[100] = {0};