代码之家  ›  专栏  ›  技术社区  ›  Graphics Noob

fscanf()可以读取空白吗?

  •  6
  • Graphics Noob  · 技术社区  · 15 年前

    我已经有一些代码可以用来读取文本文件 fscanf() ,现在我需要对其进行修改,以便以前是空白的字段需要允许空白。文本文件的基本形式是:

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

    哪个是 基本上 使用解析 fgets(inputLine, 512, inputFile); sscanf(inputLine, "%*s %s", &data); ,读取数据字段并忽略标题,但现在某些数据字段需要允许空格。我仍然需要忽略标题和后面的空白,然后在包括空白在内的行的其余部分阅读。

    有没有办法用 sscanf() 功能?

    如果不是,我可以对代码做什么最小的更改来正确地处理空白?

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

    6 回复  |  直到 15 年前
        1
  •  13
  •   pmg    15 年前

    如果你不能使用 fgets() 使用 %[ 转换说明符(带有“exclude选项”):

    char buf[100];
    fscanf(stdin, "%*s %99[^\n]", buf);
    printf("value read: [%s]\n", buf);
    

    但是 FGSE() 方法更好。


    编辑:版本 FGSE() + sscanf()

    char buf[100], title[100];
    fgets(buf, sizeof buf, stdin); /* expect string like "title: TITLE WITH SPACES" */
    sscanf(buf, "%*s %99[^\n]", title);
    
        2
  •  3
  •   Andreas Bonini    15 年前

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

    这将使您在解析非精确格式的输入方面有更大的自由度。

        3
  •  3
  •   Matteo Italia    15 年前

    最简单的方法是发布

    fscanf("%*s");
    

    要放弃第一部分,然后调用fgets:

    fgets(str, stringSize, filePtr);
    
        4
  •  3
  •   Pavel Minaev    15 年前

    如果你坚持使用 scanf ,并且假设希望换行符作为终止符,可以这样做:

    scanf("%*s %[^\n]", str);
    

    但是,请注意,上面的内容完全按照书面形式使用,这是一个坏主意,因为没有什么可防范的。 str 溢出(如 斯坎夫 不知道它的大小)。当然,您可以设置一个预先定义的最大大小,并指定它,但是您的程序可能无法在某些有效输入上正常工作。

    如果输入格式定义的行的大小不受限制,那么您唯一可行的选择是使用 fgetc 要逐字符读取数据,请在执行过程中定期重新分配缓冲区。如果您这样做,那么修改它以删除所有的读取字符,直到第一个空格是相当微不足道的。

        5
  •  2
  •   Chris Dodd    15 年前

    %s fscanf中的说明符跳过输入上的任何空白,然后读取一个非空白字符的字符串,直到不包括下一个空白字符。

    如果你想读到新行,你可以使用 %[^\n] 作为说明符。此外,格式字符串中的“”将跳过输入的空白。所以如果你使用

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

    它将在第一个空白处的一行中读取第一个字符(“标题:”在您的情况下),然后丢弃它,然后读取空白字符并丢弃它们,然后将在str中读取到一个新行中的所有字符,这听起来像是您想要的。

    注意str不会溢出——您可能想使用

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

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

        6
  •  1
  •   Norman Ramsey    15 年前

    你在挑战什么的极限 *scanf 家庭是美好的。只需稍作改动,您就可以尝试使用Dave Hanson的字符串扫描模块。 C Interfaces and Implementations . 这是对编程语言的改进 Icon 这是一种非常简单和强大的字符串处理语言,汉森和其他人在亚利桑那州工作。离开 sscanf 不会太严重,而且它比正则表达式更简单、更容易使用,而且更强大。唯一的缺点是没有这本书代码有点难理解,但是如果你做了很多C语言编程,这本书是值得拥有的。