从输入文件中读取字符串/单词和整数

时间:2018-08-21 08:45:08

标签: c string file-io

我想编写一个小程序来读取给定.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];

我真的不知道该如何解决这个问题。任何帮助将不胜感激!

谢谢您的时间。

2 个答案:

答案 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, ","));

strcpystrtok<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,您可以在其中搜索函数名称并阅读相关的手册页。