【问题标题】:Can I get fscanf to not skip over empty lines?我可以让 fscanf 不跳过空行吗?
【发布时间】:2013-02-04 11:50:51
【问题描述】:

我试图让我的程序从文件中读取输入,但不会跳过 fscanf 通常会执行的空行。扫描文件的文件和循环是:

 inFile = fopen("text.txt", "r");

 for(i = 0; fscanf(inFile, "%s", &input[i]) != EOF; i++){
     printf("%d %s\n", i, input[i]);
 }

哪个输出:

0 one
1 two
2 three
3 four
4 five
5 six
6 seven
7 eight
8 nine
9 ten
10 eleven
11 twelve
12 thirteen
13 fourteen
14 fifteen
15 sixteen
16 seventeen
17 eighteen
18 nineteen
19 twenty
20 thirty
21 forty
22 fifty
23 sixty
24 seventy
25 eighty
26 ninety

这不是我想要的。我希望读取的文本代表它所说的数组中的位置。即“九十”在输入[89]中找到。

正在读取的文件是:

one
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve
thirteen
fourteen
fifteen
sixteen
seventeen
eighteen
nineteen
twenty









thirty









forty









fifty









sixty









seventy









eighty









ninety

这些单词中的每一个都应该代表正在读取的行。我在 20 多行之间添加了空格,所以我可以使用 i 来表示正在读取的数据的行。简而言之,我正在为文本生成器制作一个数字,它将读取

999.99

作为

nine hundred ninety-nine and 99/100

tl;dr 我不想硬编码数组中包含单词的位置,所以我试图让迭代器完成工作,这需要读取的空行占据它们的位置数组。

有什么方法可以让 fscanf 在这里完成工作吗?还是我应该使用其他东西?

谢谢

【问题讨论】:

  • 所以给定你的文本文件,你希望input[20] 是一个空字符串,因为那里没有文本?
  • 是的,差不多。我的意思是,我应该在输出数组时说 (i + 1) 以消除任何混乱,但是是的。
  • 通过空格空白行吗?如果是这样,fgets().
  • 是的!编辑。对此感到抱歉。

标签: c scanf file-io


【解决方案1】:

我认为你最好使用fgets()。如有必要,您可以在结果字符串上使用sscanf() 来解析它。

编辑 - 像这样:

inFile = fopen("text.txt", "r");
size_t i = 0;

while (fgets(input[i], LINE_SIZE, inFile))
{
    printf("%d %s\n", i, input[i]);
    ++i;
}

【讨论】:

  • 我找到了文档,但是关于 fgets() 在我的情况下如何工作的任何小解释?甚至与 fscanf() 进行比较,以供 Stack Overflow 参考。
  • 是的。这就是我一直在寻找的。我没有意识到fgets() 正在返回truefalse。非常感谢。
  • @Joghobs:它不会返回truefalse 本身。从链接的文档中:“gets() 和 fgets() 在成功时返回 s,在错误时或在未读取任何字符时发生文件结尾时返回 NULL。”
【解决方案2】:

您应该查看fgets(),因为它会读取所有内容,包括换行符。请记住,这些行不是空白的,它们只是新行。此外,fgets() 是比fscanf()安全得多的选择

【讨论】:

  • 谢谢。我正在查看文档并试图让它发挥作用。你能给我一个与fscanf() 的比较和/或告诉我如何让fgets() 在我的示例中工作吗?
猜你喜欢
  • 2011-05-31
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 2021-03-30
相关资源
最近更新 更多