2011-02-25 78 views
2

我想解析给定的文本文件,但到目前为止,我的程序似乎没有正确读取。从作为命令行争论传递的文件中读取

#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吗?这立刻想到

回答

4

的一件事是,该方案ARGS包括可执行文件名作为第一个元素

argv[0]是“水井坊”

argv[1]是“file.text”

所以你应该使用

fr = fopen (argv[1], "r"); 

记住,当调试总是尝试和缩小问题,如果你知道e错误的位置原因通常变得明显或至少可以调查。

在这种情况下,您应该检查argc >= 2,打印出argv[1]以确保您尝试打开正确的文件,然后检查文件是否已成功打开。

最后检查fscanf错误代码,看看fscanf是否能够读取该数字。

+3

他必须检查'argc == 2'是否也是。 – 2011-02-25 22:22:15

+0

@Blagovest Buyukliev:非常真实,我会将其添加到答案中 – Akusete 2011-02-28 20:05:29

5

argv[0]是该程序的名称(您的情况为./sjf),因此您正尝试读取自己程序的可执行文件。使用argv[1]来获得第一个真正的程序参数。

0

您的代码看起来很清晰直截了当,但有一个重要的缺失:错误处理。

如果要打开的文件不存在,会发生什么情况?在这种情况下,fopen返回NULL。

如果文件不是以数字开头会发生什么? fscanf返回已成功读取的字段数,因此您应该检查返回值是否至少为1.

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

相关问题