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)