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;
}

我编译该程序并使用以下命令在我的 redhat linux 机器上运行它:

./sjf file.text

file.text 是第一个字符为“4”的文本文档。所以我希望我的输出是

sanity check
4

但是,当我运行我的程序时,我得到了

sanity check
1

这意味着 fscanf 没有正确读取第一个字符 -- 4. 我是否有一些语法错误阻止了预期的代码功能?我应该扫描一个字符,然后以某种方式将其转换为 int 吗?

4

3 回答 3

5

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

于 2011-02-25T22:15:42.053 回答
4

立即想到的一件事是程序 args 包含可执行文件名称作为第一个元素

argv[0]是“sjf”

argv[1]是“文件.文本”

所以你应该使用

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

请记住,在调试时要始终尝试缩小问题范围,如果您知道错误的位置,则原因通常会变得很明显或至少可以调查。

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

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

于 2011-02-25T22:15:39.760 回答
0

您的代码看起来清晰直接,但缺少一件重要的事情:错误处理。

如果您要打开的文件不存在怎么办?在这种情况下,fopen 返回 NULL。

如果文件不以数字开头会怎样?fscanf 返回已成功读取的字段数,因此应检查返回值是否至少为 1。

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

于 2011-02-25T22:23:09.873 回答