我目前正在开发一个简单的C应用程序。它将单个文件作为命令行参数,格式如下:
fscanf
但是,无论出于何种原因,#include <stdio.h>
int main(int argc, char **argv) {
FILE *file = fopen(*argv, "r");
int i1, i2, i3;
while (fscanf(file, "%d,%d,%d", &i1, &i2, &i3) == 3) {
printf("Doing stuff with %d, %d, and %d...\n", i1, i2, i3);
}
fclose(file);
return 0;
}
都不会扫描数字!这是一个例子:
fscanf
如果你以文件名作为参数运行它,那么它会立即退出,因为fscanf
返回0.我尝试了几种变体,但无济于事。如何让sacctmgr show assoc
正确读取数字?
答案 0 :(得分:2)
如BLUEPIXY所述,您应该使用argv
数组的第二个元素:argv[1]
:
FILE *file = fopen(argv[1], "r");
第一个元素(argv[0]
或*argv
)是正在执行的程序的名称 - 它不是要打开的正确文件。
答案 1 :(得分:2)
表面答案:错误的文件被打开,因为代码应该使用argv[1]
而不是*argv
。
让我们看一下。
代码在至少2个地方遇到麻烦并且没有错误检查。
FILE *file = fopen(*argv, "r");
未在file
上进行测试。这个经典的检查不会检测到OP的问题,因为可执行文件是可以打开的。
fscanf(file, "%d,%d,%d", &i1, &i2, &i3)
的返回值只是经过了轻微的测试。 EOF 0 1 2 3
的返回值是可能的,但预计只有EOF 3
。如果对非EOF 3
进行了代码测试,则很快就会发现问题。
需要学习的课程:保证代码,尤其是错误代码,有足够的错误检查。从长远来看,节省了编码时间。
#include <stdio.h>
int main(int argc, char **argv) {
if (argc != 2) {
fprintf(stderr, "Unexpected argument count %d.\n", argc);
return 1;
}
FILE *file = fopen(argv[1], "r");
if (file == NULL) {
fprintf(stderr, "Unable to open file: \"%s\"", argv[1]);
return 1;
}
int i1, i2, i3;
int n;
while ((n = fscanf(file, "%d,%d,%d", &i1, &i2, &i3)) == 3) {
printf("Doing stuff with %d, %d, and %d...\n", i1, i2, i3);
}
if (n != EOF) {
fprintf(stderr, "Unexpected scan failure count %d\n", n);
return 1;
}
fclose(file);
return 0;
}