我正在尝试解析给定的文本文件,但到目前为止,我的程序似乎没有正确读取。
#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.我是否有一些语法错误阻止了预期的代码功能?我应该扫描一个字符,然后以某种方式将其转换为int?
答案 0 :(得分:5)
argv[0]
是程序的名称(在您的情况下为./sjf
),因此您正在尝试读取自己程序的可执行文件。请使用argv[1]
来获取第一个真正的程序参数。
答案 1 :(得分:4)
立即浮现在脑海中的一件事是程序args包含可执行文件名作为第一个元素
argv[0]
是“sjf”
argv[1]
是“file.text”
所以你应该使用
fr = fopen (argv[1], "r");
请记住,在调试时总是尝试缩小问题,如果您知道错误的位置,原因通常会变得明显或至少可以调查。
在这种情况下,您应该检查argc >= 2
,打印argv[1]
以确保您尝试打开正确的文件,然后检查文件是否已成功打开。
最后检查fscanf错误代码,看看fscanf是否能够读取该数字。
答案 2 :(得分:0)
您的代码看起来很清晰直接,但缺少一件重要的事情:错误处理。
如果您要打开的文件不存在会怎样?在这种情况下,fopen返回NULL。
如果文件没有以数字开头会怎么样? fscanf返回已成功读取的字段数,因此您应检查返回值是否至少为1.
您需要以某种方式处理这些情况,可能是通过打印一些错误消息并退出程序。执行此操作时,请确保在错误消息中包含相关信息。然后你会发现其他答案已经提到的错误。