Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
fscanf()可以读取空白吗?_C_String_File Io - Fatal编程技术网

fscanf()可以读取空白吗?

fscanf()可以读取空白吗?,c,string,file-io,C,String,File Io,我已经有了一些使用fscanf()读取文本文件的代码,现在我需要修改它,以便以前没有空格的字段需要允许空格。文本文件基本上采用以下形式: 标题:数据 标题:数据 等等 基本上是使用fgets(inputLine,512,inputFile)解析的;sscanf(输入行“%*s%s”和数据),读取数据字段并忽略标题,但现在一些数据字段需要允许空格。我仍然需要忽略标题和紧跟其后的空格,但随后请阅读包括空格在内的行的其余部分 使用sscanf()函数是否可以实现这一点 如果没有,我能对代码做什么最小的

我已经有了一些使用
fscanf()
读取文本文件的代码,现在我需要修改它,以便以前没有空格的字段需要允许空格。文本文件基本上采用以下形式:

标题:数据
标题:数据
等等

基本上是使用
fgets(inputLine,512,inputFile)解析的;sscanf(输入行“%*s%s”和数据),读取数据字段并忽略标题,但现在一些数据字段需要允许空格。我仍然需要忽略标题和紧跟其后的空格,但随后请阅读包括空格在内的行的其余部分

使用
sscanf()
函数是否可以实现这一点

如果没有,我能对代码做什么最小的更改来正确处理空白


更新:我编辑了这个问题,将fscanf()替换为fgets()+sscanf(),这就是我的代码实际使用的内容。当我第一次写这个问题的时候,我并不认为它是相关的,这就是为什么我将它简化为fscanf()。

我强烈建议你停止使用
fscanf()
,开始使用
fgets()
(读取整行),然后解析已经读取的行


这将允许您在解析非精确格式的输入时有更多的自由。

最简单的方法是发出

fscanf("%*s");
要放弃第一个零件,然后只调用FGET:

fgets(str, stringSize, filePtr);

如果无法使用
fgets()
请使用
%[
转换说明符(带有“排除选项”):

但是
fgets()
要好得多。


编辑:带有
fgets()
+
sscanf()的版本


如果您坚持使用
scanf
,并假设您想要换行符作为终止符,您可以这样做:

scanf("%*s %[^\n]", str);
但是,请注意,上面的内容(完全按照编写的方式使用)是一个坏主意,因为没有什么可以防止
str
溢出(因为
scanf
不知道它的大小)。当然,您可以设置预定义的最大大小,并指定它,但是您的程序可能无法在某些有效输入上正常工作


如果输入格式定义的行大小不受限制,那么您唯一实用的选择是使用
fgetc
逐字符读取数据,在执行时定期重新分配缓冲区。如果这样做,则修改它以删除所有读取的字符,直到第一个空格非常小。

fs中的
%s
说明符canf跳过输入上的任何空白,然后读取一个非空白字符字符串,最多不包括下一个空白字符

如果要读取换行符,可以使用
%[^\n]
作为说明符。此外,格式字符串中的“”将跳过输入上的空白。因此,如果使用

fscanf("%*s %[^\n]", &str);
它将读取行中的第一个内容,直到第一个空格(“title:”在您的情况下),然后将其扔掉,然后读取空格字符并将其扔掉,然后将所有字符读到str中的新行,听起来就像您想要的一样

小心str不会溢出--您可能需要使用

fscanf("%*s %100[^\n]", &str)

限制要读取的最大字符串长度(100个字符,此处不计算终止NUL).

您正面临着
*scanf
系列的局限性。只需稍作改动,您就可以尝试使用Dave Hanson的字符串扫描模块。这是对编程语言的改进,这是Hanson和其他人开发的一种极其简单、功能强大的字符串处理语言亚利桑那州。
sscanf
的偏离不会太严重,它比正则表达式更简单、更容易使用、功能更强大。唯一的缺点是没有这本书,代码有点难以理解,但如果你做了大量的C编程,这本书很值得拥有。

如果你习惯于使用
scanf解析它
,然后您也可以在前面解析类似于
标题:数据标题:数据的内容(即,所有内容都在一行中)。如果您想在值中允许空白,那么终止符是什么?如果是换行符,那么您的原始代码似乎有点太松散了…另外,您如何确定
str
缓冲区的大小,以及如何确保它不会溢出?是的,当数据可以有空白时,换行符将用作该缓冲区的终止符s特殊情况下,
fgets
如何“更好”?好吧……需求一直在变化(首先字符串中没有空格)。对于这种特殊情况,这不是更好,但最好使用
fgets()要读取行,然后使用sscanf()来解析它,但是在fgets()之后是否有更好的方法来解析行?
fgets()
+
sscanf()
是解析(简单)字符串的好方法。@Calmarius:是的,这是标准的C89。我没有C89的参考资料,但你可以在中阅读。我更新了这个问题,以表明我确实使用了fgets()我不知道它到底会有什么帮助。我必须在读一段之后解析它。一旦你得到了整个字符串,就自己走,而不是使用sSCANF。是的,用指针来做,或者更好地使用正则表达式。如果你用C++,我会建议Boost;我不知道有什么好的C库,但是一定有一些。。我听说POSIX支持它们。我知道这是一个简短的示例,但您必须使用str的地址吗?我想这也可以。
fscanf(“%*s%[^\n]”,str);
fscanf("%*s %[^\n]", &str);
fscanf("%*s %100[^\n]", &str)