c - Fscanf 和分隔符

标签 c delimiter scanf

我正在尝试从 C 语言的文件中读取数据,该文件将始终以这种类型的行进行格式化:

16 Oct 2013 00:01:00.000,0.000,0.000000

这是一个字符串、一个逗号、一个 float 、一个逗号、一个 float 和一个 \n

我遇到了奇怪的事情,我开始尝试仅使用字符串,然后我意识到:

fscanf(filefd, "\n%24[^,]s", data);
fscanf(filefd, ",%5s", data2);

fscanf(filefd, "\n%24[^,]s,", data);
fscanf(filefd, "%5s", data2);

fscanf(filefd, "\n%24[^,]s,%5s", data, data2);

为什么第一个案例有效而其他两个案例无效?如果我将逗号放在变量之前、格式字符串的开头,它就可以工作。如果我将逗号放在其他格式字符串中,但最后,我会在 data2 中得到逗号。最后,如果我把它们放在一起,data2 没有任何有效数据,但 data 有。

我是否错过了一些东西来获得这种奇怪的行为?

最佳答案

%[] 对应的参数类型已经是一个字符串,因此尾随 s ]之后不需要指示字符串目标,因此预计会出现在输入流中。在所有情况下,输入在]之后停止被消耗。因为s不存在,留下,在输入流中。

第一个代码片段有效,因为它处理 ,独立于]s ,最后两个片段没有,因此失败,因为 s,不会出现在输入流中。

始终检查 fscanf() 的返回值确定成功分配的数量。

关于c - Fscanf 和分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17522214/

相关文章:

java - 带空格的分隔符和分隔符后读取空格

c++ - strtok 如何还包括分隔符作为标记

c++ - 如何在 cpp 中使用 CRLF 分隔符拆分字符串?

c - 我需要一种只接受大写字母的方法

C - 使用 scanf 问题查找最大、最小和平均值

c++ - 如何使用 C++ 将 ASCII 文件的特定列存储(或转换)为数组?

c - 将 linux x86 中的上下文从用户空间切换为使用 Xenomai 运行

c++ - c语言中SHA1()函数的参数详细用法是什么

c# - 将二进制读取函数从 C# 转换为 C

c++ - C/C++ 中的静态作用域