Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 读取作为命令行参数传递的文件_C_Linux_Filereader_Scanf - Fatal编程技术网

C 读取作为命令行参数传递的文件

C 读取作为命令行参数传递的文件,c,linux,filereader,scanf,C,Linux,Filereader,Scanf,我正在尝试解析给定的文本文件,但到目前为止,我的程序似乎无法正常读取 #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", &build

我正在尝试解析给定的文本文件,但到目前为止,我的程序似乎无法正常读取

#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;
}
file.text是第一个字符为“4”的文本文档。所以我希望我的输出是

sanity check
4
然而,当我运行我的程序时,我得到的是

sanity check
1

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

我马上想到的一件事是,程序args包含可执行文件名作为第一个元素

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


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

他必须检查
argc==2
。@Blagovest Buyukliev:非常正确,我会把它添加到答案中
fr = fopen (argv[1], "r");