我想编写一个小程序来读取给定.csv / .txt文件中的行,并根据用户输入打印出具体细节。
我目前正在与一个
FILE *input = fopen("Example.csv", "r");
输入看起来像这样:
Test000, 40, 0, empty
Test001, 0, -41, empty
现在,如果我尝试从输入中 fscanf(),它只会设置第一个char [],而忽略其他变量。
我的 fscanf()调用看起来像这样:
fscanf(input, "%s , %d , %d , %s", name, &timeA, &timeB, info);
# I'm calling fscanf(...) inside of while()-condition.
# while (fscanf(...) == 4) { *apply logic here* }
因此,使用此代码, fscanf()仅将名称设置为“ Test000”,然后设置为“ 40”,“ 0”,“空”等,但忽略timeA,timeB,和信息。
它们的定义为:
char name[51];
int timeA = 0;
int timeB = 0;
char info[51];
我真的不知道该如何解决这个问题。任何帮助将不胜感激!
谢谢您的时间。
答案 0 :(得分:1)
可以使用扫描集。 %50[^,]
最多可以读取50个字符或逗号。
fscanf(input, " %50[^,], %d , %d , %50s", name, &timeA, &timeB, info);
请注意&50[^,]
之前的空格以消耗前导空白。
检查fscanf
的返回值。在这种情况下,如果所有四个项目都被成功扫描,将返回4。
答案 1 :(得分:0)
fscanf()
对待连续字符,直到遇到空格作为单个字符串(char[]
的一部分)-因此,最好的选择是删除.txt
中的逗号文件,然后将fscanf设置为以下内容:fscanf(input, "%s %d %d %s", name, &timeA, &timeB, info);
-您的数据应类似于:Test000 40 0 empty
。这是使其工作最直接的方法。
如果您希望它与当前数据格式一起使用,fscanf()
可能不是最佳选择。使用一些<string.h>
形式的函数会更好。
char data[512];
fgets(data, sizeof (data), input);
strcpy(name, strtok(data), ","));
timea = (int) strtol(strtok(data, ","), NULL, 10);
timea = (int) strtol(strtok(data, ","), NULL, 10);
strcpy(info, strtok(data, ","));
(strcpy
和strtok
在<string.h>
中都可用,strtol()
在<stdlib.h>
中都可用)
strcpy
用于复制“字符串”。
strtok
分割字符串(请注意,它修改了传递的字符串!)。
strtol
将字符串转换为long(我们将其转换为int)。
某些功能有更安全的版本(即strtok_r()
和strtol()
也有int
版本(因此您无需将其返回值强制转换为int
)称为strtod()
如果您使用的是* nix系统,最好运行man function_name()
(例如man strtok
)以更好地了解函数原型及其作用/行为方式等等-或者您始终可以在线阅读手册页,例如FreeBSD Online Manual Pages,您可以在其中搜索函数名称并阅读相关的手册页。