我试图parsing给定的文本文件,但到目前为止,我的程序似乎没有正确读取。
#include <stdio.h> int main(int argc, char *argv[]) { FILE *fr; //file pointer int buildingFloors = 1; printf("sanity check\n"); fr = fopen (argv[0], "r"); fscanf(fr, "%d", &buildingFloors ); printf("%d\n", buildingFloors); fclose(fr); return 0; }
我编译该程序,并使用以下命令在我的redhat linux机器上运行它:
./sjf file.text
file.text是一个带有“4”作为第一个字符的文本文档。 所以我希望我的输出是
sanity check 4
但是,当我运行我的程序,而是得到
sanity check 1
这意味着fscanf在第一个字符中没有正确读取 – 4.我是否有一些语法错误,从而阻止了预期的代码function? 我应该扫描一个字符,然后将其转换为int?
立即想到的一件事是,程序参数包含可执行文件名称作为第一个元素
argv[0]
是“sjf”
argv[1]
是“file.text”
所以你应该使用
fr = fopen (argv[1], "r");
请记住,在调试时总是尝试缩小问题的范围,如果知道错误的位置,原因通常变得明显,或者至少是可以调查的。
在这种情况下,您应该检查argc >= 2
,打印argv[1]
以确保您尝试打开正确的文件,然后检查文件是否已成功打开。
最后检查fscanf错误代码,看看fscanf是否能够读取数字。
argv[0]
是程序的名称(在你的情况下是./sjf
),所以你正试图读你自己的程序的可执行文件。 使用argv[1]
来获得第一个真正的程序参数。
你的代码看起来很简单明了,但是有一个重要的缺失:错误处理。
如果要打开的文件不存在,会发生什么情况? 在这种情况下,fopen返回NULL。
如果文件没有以数字开头,会发生什么? fscanf返回已成功读取的字段数,因此您应该检查返回值是否至少为1。
您需要以某种方式处理这些情况,可能是通过打印一些错误消息并退出程序。 当你这样做的时候,一定要在错误信息中包含相关的信息。 那么你会发现其他答案已经提到的错误。