从作为命令行parameter passing的文件中读取

我试图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。

您需要以某种方式处理这些情况,可能是通过打印一些错误消息并退出程序。 当你这样做的时候,一定要在错误信息中包含相关的信息。 那么你会发现其他答案已经提到的错误。