[英]Reading Strings/words and integers from input file
我想编写一个小程序来从给定的 .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()只会将 name 设置为“Test000”,然后设置为“40”、“0”、“empty”等,但会忽略 timeA、timeB 和 info。
它们被定义为:
char name[51];
int timeA = 0;
int timeB = 0;
char info[51];
我真的不知道如何规避这个问题。 任何形式的帮助将不胜感激!
感谢您的时间。
可以使用扫描集。 %50[^,]
最多可读取 50 个字符或逗号。
fscanf(input, " %50[^,], %d , %d , %50s", name, &timeA, &timeB, info);
注意&50[^,]
之前的空格以消耗前导空格。
检查fscanf
的返回。 在这种情况下,如果所有四个项目都成功扫描,则将返回 4。
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
版本(因此您不需要将其返回值strtok_r()
为int
)称为strtod()
如果您在 *nix 系统上,最好运行man function_name()
(例如man strtok
)以更好地了解函数原型及其功能/行为方式等。 - 或者您总是可以在线阅读手册页,例如FreeBSD 在线手册页,您可以在其中搜索函数名称并阅读相关手册页。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.