繁体   English   中英

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

[英]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, ","));

strcpystrtok<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM