这两天在做语法分析程序,因为之前写完了词法分析程序,所以做语法分析时直接读取了词法分析的“out.txt”文件(单词流文件)。在读取时,遇到fscanf(fp, "%s %s\n", token, token1);
以及fscanf(fp, "%s %s\n", &token, &token1);
两种fscanf函数,token是char(20)。
之前就对文件的输入输出不太了解,所以这时也没敢去修改,运行的时候总是会在中间出现异常,经过测试是某个单词未成功读入,于是就想到了这个问题。
int fscanf(FILE *stream, char *format,[argument...]);
这个是fscanf的函数声明,里面可以看到,第一个参数是文件指针,指向要从该文件中将数据读出,第二个参数是格式字符串,就像scanf("%s %s\n");
的一样,第三个参数是输入列表,会将文件中的数据保存到输入列表中去。
for example:
文件指针指向out.txt文件,该文件中第一行:
“function function”两个function中间有空格或缩进
执行
fscanf(fp, "%s %s\n", token, token1);
执行后结果:
token[20] = “function”
token1[20] = “function”
从这个例子中可以看到fscanf和scanf的用法类似,唯一不同的就是fscanf多了一个文件指针的参数。当输入列表中的变量类型为字符数组,token前就不用加&,因为token就表示字符数组首地址。