【问题标题】:Junk data when using fread使用 fread 时的垃圾数据
【发布时间】:2012-05-20 21:56:23
【问题描述】:

我正在尝试使用 fread 从文本文件中获取数据行。我的程序做的第一件事是打开文本文件,并确定每行开头的字节偏移量。

第1行的字节偏移量为0,注视offset[1]。第 2 行的字节偏移量可能是 45 个字节,这将存储在 offset[2] 中,依此类推。 EOF的字节偏移存储在array[lastline + 1]

在一个循环中,我正在尝试使用这些语句来打印我想要的内容:

fseek(fptr, ptr[line], SEEK_SET);
fread(str, sizeof(char),  (  (ptr[line + 1] - ptr[line]) - 2) / sizeof(char) , fptr);
printf("%03ld %03ld %s\n", line, ptr[line + 1 ] - ptr[line], str);

我的 fread 语句使用((ptr[line + 1] - ptr[line]) - 2) / sizeof(char) 作为要打印的元素数。我有几个问题。

  1. 我正在使用 -2 来尝试解释换行符和回车符。 我的教授说我有两个额外的字节/行,因为 换行符和回车符。我应该试着照顾 他们这样吗?它会使我的程序不那么便携吗?
  2. 我的程序将根据用户打印一系列行或单行 要求。当我打印多行时,第二行的输出 真的被破坏了。

    打印第 2 到 4 行 ... 线路:2 002 005 123 003 011 123456789¼ü|♥ 004 007 123456789¼ü|♥

第一列是行号,第二列是该行的字节长度,而不是字节偏移量。当我只打印一行时,有时会出错,但并非总是如此。

Printing line 1...
001 008 123456☻

我在想我要么没有正确使用 fread,要么我在打印之前从文本文件中读取并将其存储到临时字符串中的方式非常奇怪。似乎是什么问题?

编辑:

好的,所以我使用 fread 的循环已经将返回值分配给了某个变量。直到现在我都不知道该怎么处理它。按照 cmets 中的建议,我正在使用

count = fread(stuff);
str[count] = '\0';

这似乎已经解决了。

【问题讨论】:

  • 你忽略了fseekfread的返回值,这几乎可以保证是严重的编程错误。
  • 你在哪里验证 ptr[line+1]-ptr[line] 不会破坏你的 str 缓冲区的大小?
  • @jthill 我为 str 分配了 BUFSIZ 个字符。我觉得是512个字符,应该够大了吧?

标签: c arrays string file-io


【解决方案1】:

我认为您可能忘记了空终止符

char s[] = "ABC"; // {'A', 'B', 'C', '\0'}

s[3] = '\0';

【讨论】:

  • NULL 是一个空 pointer 值,您的代码正试图将其分配给 char。我建议改用s[3] = '\0's[3] = 0
  • 我是否在我发布的几行代码中执行此操作?仅用这几行代码,我看不到我可以在哪里做到这一点..
  • 那是您的错误;) 您应该在代码中的某个位置设置终止 '\0',但您不这样做。
  • @R..'\0' 明确(对读者)它是char,而不是int
  • '\0'int,而不是 char
【解决方案2】:

在使用str 之前,您需要在某个时候说str[something] = 0。如果您正在处理一个文本文件,它肯定不会包含 0 终止符。

这可能是fread 返回的字符数。


旁注:sizeof(char) 看起来很荒谬,因为它的定义是 1。

【讨论】:

  • sizeof(char) 是很好的代码风格,因为它读起来更自然。读者知道那是大小。如果他/她读到 1,则不太清楚为什么是 1。
  • @leemes *Diplomacy on* 我想这是一个品味问题 :-)
  • 是的,我认为清楚很重要,我不知道编码字符的约定,但是如果在某些系统上,它是两个呢?
  • @user1357836:C 标准要求sizeof(char) == 1,即使char 类似于16 位。
  • @leemes sizeof(X) 在您知道 X 的底层大小时毫无意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 2015-02-23
  • 2011-09-21
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
相关资源
最近更新 更多