1

我正在尝试使用 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 行 ... LINE: 2 002 005 123 003 011 123456789¼ü|♥ 004 007 123456789¼ü|♥</p>

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

Printing line 1...
001 008 123456☻

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

编辑:

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

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

这似乎已经解决了。

4

2 回答 2

2

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

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

s[3] = '\0';

于 2012-05-20T21:59:02.333 回答
1

str[something] = 0使用str. 如果您正在处理一个文本文件,它肯定不会包含 0 终止符。

这可能是返回的字符数fread


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

于 2012-05-20T21:59:26.360 回答