【问题标题】:How to get input from a file using fscanf ignoring commas?如何使用 fscanf 忽略逗号从文件中获取输入?
【发布时间】:2015-03-10 21:59:26
【问题描述】:

所以,我得到了这个带有一堆文本的文件。我需要使用 fscanf 逐字获取并忽略逗号。所以this, 应该读作this

我试过了

fscanf(file,"[^,]",string);

但它停在带逗号的单词处。

我该怎么做?

我只能用 fscanf 忽略逗号,没有额外的逻辑

【问题讨论】:

  • fscanf(file,"%[^,],",string);

标签: c input formatting scanf


【解决方案1】:

这是一个更坚固的版本。它接受空格和逗号的任意组合作为单词分隔符:

假设char string[100];

for (;;) {
    /* skip any spaces and an optional comma */
    fscanf(file, " ,");
    if (fscanf(file," %99[^, \t\n\f\r\v]", string) == 1) {
        /* handle string value read from file */
    }
    if (feof(file))
        break;
}

使用此格式字符串,fscanf 将跳过空格和可选逗号,读取下一个单词,在 ',' 或空格字符处停止,如果成功读取则处理 string,并继续直到file 结束。

如果string被读取,fscanf将返回1,否则它甚至不会修改string。如果流 file 在调用之前位于文件末尾,或者连续有多个逗号,则可能会发生这种情况。这些将在连续迭代中被解析,直到有一个实际的单词要读取。

【讨论】:

  • 正如OP所说“我只能使用fscanf”,可以用fscanf(file, "%c")替换所需的单独getc(file)
  • fscanf(file, "%*c"); 应该与fscanf(file," %99[^, ]%*c",string) 分开。如果输入以',' 开头,则string 未初始化,',' 保留在file 中。最好string[0] = 0; if fscanf(file,"%99[^, ]",string) ...; fscanf(file,"%*c") - 更接近您的原始答案。
  • 如果file',' 开头,fscanf 在这两种情况下都会失败。如果单词后面有超过 1 个逗号,有或没有中间空格,也会发生同样的情况。 fscanf 不适合解析输入 ;-)。我将编辑帖子以获得更可靠的解决方案。
  • 文件以','开头的区别在于fscanf(file," %99[^, ]%*c",string)不消耗',',而fscanf(file,"%99[^, ]",string); fscanf(file,"%*c")消耗。因此,您的第一种方法和当前的方法具有单独的fscanf() 呼叫的优势。 IAC,我同意fscanf() 不是那么不适合解析。
  • @chux: 你的意思是说我同意fscanf()不是那么适合解析
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 2020-07-01
相关资源
最近更新 更多