fscanf 不扫描任何数字
fscanf not scanning any numbers
我目前正在开发一个简单的 C 应用程序。它以单个文件作为命令行参数,其格式如下:
1,2,3
4,5,6
7,8,9
etc.
然而,无论出于何种原因,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
返回 0。我已经尝试了几种变体,但无济于事。如何让 fscanf
正确读出数字?
正如 BLUEPIXY 所指出的,您应该使用 argv
数组的第二个元素:argv[1]
:
FILE *file = fopen(argv[1], "r");
第一个元素(argv[0]
或 *argv
)是正在执行的程序的名称 - 它不是要打开的正确文件。
肤浅的回答:打开了错误的文件,因为代码应该使用 argv[1]
而不是 *argv
。
让我们看得更深。
代码有问题并且至少在 2 个地方缺少错误检查。
FILE *file = fopen(*argv, "r");
之后没有对 file
进行测试。这种经典检查不会检测到 OP 的问题,因为文件(可执行文件)是 open-able.
来自 fscanf(file, "%d,%d,%d", &i1, &i2, &i3)
的 return 值仅经过轻微测试。 Return 的值 EOF 0 1 2 3
是可能的,但只有 EOF 3
是预期的。如果针对非 EOF 3
测试代码,问题很快就会被发现。
要吸取的教训:确保代码,尤其是 mis-behaving 代码,具有足够的错误检查。在长 运行.
中节省编码器时间
#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;
}
我目前正在开发一个简单的 C 应用程序。它以单个文件作为命令行参数,其格式如下:
1,2,3
4,5,6
7,8,9
etc.
然而,无论出于何种原因,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
返回 0。我已经尝试了几种变体,但无济于事。如何让 fscanf
正确读出数字?
正如 BLUEPIXY 所指出的,您应该使用 argv
数组的第二个元素:argv[1]
:
FILE *file = fopen(argv[1], "r");
第一个元素(argv[0]
或 *argv
)是正在执行的程序的名称 - 它不是要打开的正确文件。
肤浅的回答:打开了错误的文件,因为代码应该使用 argv[1]
而不是 *argv
。
让我们看得更深。
代码有问题并且至少在 2 个地方缺少错误检查。
FILE *file = fopen(*argv, "r");
之后没有对file
进行测试。这种经典检查不会检测到 OP 的问题,因为文件(可执行文件)是 open-able.来自
fscanf(file, "%d,%d,%d", &i1, &i2, &i3)
的 return 值仅经过轻微测试。 Return 的值EOF 0 1 2 3
是可能的,但只有EOF 3
是预期的。如果针对非EOF 3
测试代码,问题很快就会被发现。
要吸取的教训:确保代码,尤其是 mis-behaving 代码,具有足够的错误检查。在长 运行.
中节省编码器时间#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;
}