使用fread时的垃圾数据

时间:2012-05-20 21:56:23

标签: c arrays string file-io

我正在尝试使用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 003011123456789¼ü|♥ 004 007123456789¼ü|♥

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

    Printing line 1...
    001 008 123456☻
    

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

    编辑:

    好的,所以我使用fread的循环已经将返回值分配给某个变量。直到现在我才知道该怎么做。根据评论中的建议,我正在使用

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

    这似乎解决了这个问题。

2 个答案:

答案 0 :(得分:2)

我认为你可能忘记了null终结符

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

s[3] = '\0';

答案 1 :(得分:1)

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

可能是fread返回的字符数。


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