【问题标题】:C - fscanf - Can you move the file pointer forward?C - fscanf - 你能向前移动文件指针吗?
【发布时间】:2016-11-27 16:34:35
【问题描述】:

目前在我的程序中,我使用 fscanf 读取文件直到它到达 |象征。这是一个问题,因为当它到达第一个 | 时,它不会向前移动。我可以将指针向前移动一个位置吗?

这是我正在使用的代码:

fscanf(reader, "%d[^|]", &record1[0].CustomerID);
printf("%d \n", record1[0].CustomerID);
fscanf(reader, "%99[^|]", record1[0].domain);
printf("%s \n", record1[0].domain);
fscanf(reader, "%99[^\n]", record1[0].timestamp);
printf("%s \n", record1[0].timestamp);

文件中的信息是这样分开的:

31|www.facebook.com|2015-10-15 12:13:02

任何帮助将不胜感激

【问题讨论】:

  • 查看 fseek() 函数。
  • fseek() 函数。
  • 什么是"%d[^|]"
  • @Oleksandr Kravchuk:fseek 不能用于在文本流中定位。在文本流中fseek 只能定位到之前ftell 的结果。

标签: c


【解决方案1】:

首先,%[] 是一种自给自足的格式,只能读取字符串。你的"%d[^|]" 在第一个fscanf 中并不代表“读取一个整数直到| 符号”,正如你可能想要的那样。 %d 格式本身将在 | 处停止,因为 | 字符不是整数表示的有效部分。

其次,在其余情况下,您只需对遇到的字符执行非分配读取

fscanf(reader, "%99[^|]%*c", record1[0].domain);

这将跳过该字符并将文件指针向前移动 1 个字符。

或者,或者,如果您的格式如此严格,您可以将fscanf写成这样

fscanf(reader, "%99[^|]|", record1[0].domain);

在这种情况下,第一个fscanf 可以写成

fscanf(reader, "%d|", &record1[0].CustomerID);

但请记住,%[] 格式无法读取空字符串。当%[] 格式与单个输入字符不匹配时,它失败 而不是读取空字符串。

这样的怪癖是最好使用fgets 然后手动解析字符串的原因。

【讨论】:

  • 嗯,我明白了,谢谢你的信息!我仍然使用您提供的行发现 fscanf 在初始 | 之后没有读取字符串。它只是保留其原始价值。这不是因为它没有超过第一个|吗?
  • @Thomas Millward:也许吧。 (我没有看到你的代码)。第一个fscanf(以及其余的)可以写成fscanf(reader, "%d|", &record1[0].CustomerID);。这应该会超过|
  • 解决了!谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
相关资源
最近更新 更多