【发布时间】: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) 作为要打印的元素数。我有几个问题。
- 我正在使用 -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';
这似乎已经解决了。
【问题讨论】:
-
你忽略了
fseek和fread的返回值,这几乎可以保证是严重的编程错误。 -
你在哪里验证 ptr[line+1]-ptr[line] 不会破坏你的 str 缓冲区的大小?
-
@jthill 我为 str 分配了 BUFSIZ 个字符。我觉得是512个字符,应该够大了吧?