C 使用fread时垃圾数据

C 使用fread时垃圾数据,c,arrays,string,file-io,C,Arrays,String,File Io,我正在尝试使用fread从文本文件中获取数据行。我的程序做的第一件事是打开文本文件,并确定每行开头的字节偏移量 第1行的字节偏移量为0,开始于偏移量[1]。第2行的字节偏移量可能是45字节,这将存储在偏移量[2]中,以此类推。EOF的字节偏移量存储在数组[lastline+1] 在循环中,我尝试使用以下语句打印我想要的内容: fseek(fptr, ptr[line], SEEK_SET); fread(str, sizeof(char), ( (ptr[line + 1] - ptr[li

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

第1行的字节偏移量为0,开始于偏移量[1]。第2行的字节偏移量可能是45字节,这将存储在
偏移量[2]
中,以此类推。
EOF
的字节偏移量存储在
数组[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的循环已经将返回赋值给某个变量了。直到现在我才知道该怎么处理它。根据评论中的建议,我使用

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

    这似乎已经解决了它。

    我想你可能忘记了空终止符

    chars[]=“ABC”//{'A','B','C','\0'}


    s[3]='\0'

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

    这可能是
    fread
    返回的字符数



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

    sizeof(char)
    是很好的代码样式,因为它读起来更自然。读者知道这就是尺寸。如果他/她读1,就不太清楚为什么它是1。@leems
    *外交*
    我想这是一个品味的问题:-)是的,我认为清楚是很重要的,我不知道字符编码的约定,但是如果在某些系统上,它是两个呢?@user1357836:C标准要求
    sizeof(char)=1
    ,即使
    char
    大约是16位。@leemes sizeof(X)在知道X的基本大小时是毫无意义的。您忽略了
    fseek
    fread
    的返回值,这几乎肯定是一个严重的编程错误。您在哪里验证ptr[line+1]-ptr[line]不会影响str缓冲区的大小吗?@jthill我为str分配了BUFSIZ个字符。我认为它是512个字符,应该足够大吗?
    NULL
    是一个空指针值,您的代码正试图将其分配到
    char
    中。我建议改为使用
    s[3]='\0'
    s[3]=0
    。我是在发布的几行代码中这样做的吗?我不知道在这几行代码中我能做到什么……那是你的错误;)您应该在代码中的某个点设置终止的
    '\0'
    ,但您没有设置。@R
    '\0'
    清楚地表明(对于读者而言)它是
    字符
    ,而不是
    int
    '\0'
    int
    ,而不是
    字符