从作为命令行争论传递的文件中读取
问题描述:
我想解析给定的文本文件,但到目前为止,我的程序似乎没有正确读取。从作为命令行争论传递的文件中读取
#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;
}
我编译程序和我的红帽的Linux机器上,使用下列命令运行它:
./sjf file.text
file.text是一个“4”文本文档作为第一个字符。所以,我希望我的输出是
sanity check
4
然而,当我运行我的程序,而不是我得到
sanity check
1
这意味着的fscanf没中第一个字符正确读取 - 4.是否我有一些语法错误会阻止预期的代码功能?我应该扫描一个字符,然后将其转换为int吗?这立刻想到
答
的一件事是,该方案ARGS包括可执行文件名作为第一个元素
argv[0]
是“水井坊”
argv[1]
是“file.text”
所以你应该使用
fr = fopen (argv[1], "r");
记住,当调试总是尝试和缩小问题,如果你知道e错误的位置原因通常变得明显或至少可以调查。
在这种情况下,您应该检查argc >= 2
,打印出argv[1]
以确保您尝试打开正确的文件,然后检查文件是否已成功打开。
最后检查fscanf错误代码,看看fscanf是否能够读取该数字。
答
argv[0]
是该程序的名称(您的情况为./sjf
),因此您正尝试读取自己程序的可执行文件。使用argv[1]
来获得第一个真正的程序参数。
答
您的代码看起来很清晰直截了当,但有一个重要的缺失:错误处理。
如果要打开的文件不存在,会发生什么情况?在这种情况下,fopen返回NULL。
如果文件不是以数字开头会发生什么? fscanf返回已成功读取的字段数,因此您应该检查返回值是否至少为1.
您需要以某种方式处理这些情况,可能是通过打印某些错误消息并退出程序。当你这样做时,一定要在错误信息中包含相关信息。然后你会发现其他答案已经提到的错误。
他必须检查'argc == 2'是否也是。 – 2011-02-25 22:22:15
@Blagovest Buyukliev:非常真实,我会将其添加到答案中 – Akusete 2011-02-28 20:05:29