【问题标题】:fscanf and newline characterfscanf 和换行符
【发布时间】:2012-10-24 16:23:32
【问题描述】:

我有 fscanf 从配置文件中读取设置行。这些设置具有严格的预定义格式,看起来像

name1=option1;
name2=option2;
...

基本上我是这样

fscanf(configuration,"%[^=]=%[^;];",name,option);

其中配置是文件流,名称和选项是编程缓冲区。

问题是名称缓冲区包含我不想要的换行符。我在“[^...]”设置中错过了格式说明符以跳过换行符吗?无论如何,它可以通过格式说明符解决吗?

顺便说一句:通过写这个来吞下换行符

"%[^=]=%[^;];\n"

我认为这并不优雅,因为换行符可以在任何地方重复多次。

【问题讨论】:

  • 如果 nameN 字段不能包含空格,只需在格式字符串前面添加一个空格 - " %[^=]=%[^;];" - 以跳过前导空格。如果可以,您需要使用 getchar() 自行使用换行符。
  • 接受的答案是正确的,无论如何,关于重复的换行符,您可以使用%*[\n] 读取任意数量的'\n' 而无需存储它们。

标签: c regex file-io


【解决方案1】:

只需在格式字符串末尾添加空格即可:

"%[^=]=%[^;]; "

这会吃掉所有的空白字符,包括换行符。

引用cplusplus.com:

空白字符:该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空白字符包括空格、换行符和制表符——参见 isspace)。格式字符串中的单个空格会验证从流中提取的任意数量的空格字符(包括无)。

【讨论】:

    【解决方案2】:

    另一种方法是使用fgets() 将整行读入字符串,然后使用sscanf()。这在调试方面有一个优势,您可以准确地看到函数正在处理的数据。

    【讨论】:

      【解决方案3】:

      这将起作用:

      fscanf(configuration,"%[^=]=%[^;];%[^\n]",name,option,dummy);

      您将不得不使用换行符。否则,换行符将留在输入流中。

      【讨论】:

      • 嗯...那么 dummy 应该有多大?大到可以吞下所有可能的换行符?
      • 既然你说你有严格的预定义输入数据格式,你可以计算一下。完全需要的字符并创建虚拟变量。这将帮助您找出与输入格式的任何可能偏差,而不是跳过它们。(如果您在 fscanf 或 fgets 之前或之后使用空格,则会发生这种情况)。
      • 在结尾处缺少%,无论如何为什么不使用%[^=]=%[^;];%*[^\n] 而忘记那些换行符和包含它们的缓冲区?
      • @effeffe:这也是个好主意。 OP的问题表明输入字符串格式将是固定的,因此我使用了这种方法,认为找出文件中的任何行是否不符合固定格式标准可能很有用。 :)
      猜你喜欢
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 2019-03-14
      • 2021-12-30
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多