C 使用fread时垃圾数据
我正在尝试使用fread从文本文件中获取数据行。我的程序做的第一件事是打开文本文件,并确定每行开头的字节偏移量 第1行的字节偏移量为0,开始于偏移量[1]。第2行的字节偏移量可能是45字节,这将存储在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
偏移量[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)
表示要打印的元素数。我在这里有几个问题
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
,而不是字符
。