fwrite(&input_records[i], sizeof(struct info), 200000, fpbin);
你刚才说
fwrite
写
200000 * sizeof(struct info)
字节到文件,从的地址开始
input_records[i]
.访问的内存远远超出了已分配的内存
input_records
,行为是未定义的,但分割错误并非不可能。事实上,我很惊讶它没有为你崩溃。
buffer = (char *)malloc(sizeof(struct info));
fread(buffer, fileLen, 1, fpread);
你正在努力阅读
fileLen
字节放入大小为的缓冲区
sizeof(struct info)
如果
fileLen > sizeof(struct info)
,这也是未定义的行为,如果
文件长度
足够大,很可能会崩溃。
你应该让
写入文件
一
大小物体
sizeof(结构信息)
每次,您应该分配
文件长度
您读入的缓冲区的字节数(或读入大小为块的缓冲区)
sizeof(结构信息)
)。您应该检查的返回值
写入文件
和
fread
以了解他们是否成功地写入/读取了所需的数据并适当地处理了故障。
fpbin = fopen("info2.bin", "wb");
if (!fp)
{
你检查错了
FILE*
在这里,而你不检查
fpread
完全
此外,您将错误的计数传递给
dump_buffer
,
dump_buffer(buffer, sizeof(buffer));
buffer
是一个
char*
所以
sizeof buffer
是一个的大小
炭*
,通常为四个或八个字节。您应该将分配的缓冲区大小传递到那里。
并且当读取原始文件时,
while (!feof (fp)) {
fgets(line, sizeof(line),fp);
feof(fp)
只有在到达文件末尾时尝试读取后才变为true,您应该将循环条件更改为
while(fgets(line, sizeof line, fp) != NULL) {
最后,如果输入文件包含格式错误的数据或太长的行,则标记化代码将严重失败。你还应该在那里添加检查,这样你就不会通过
NULL
到
strcpy
或
atoi
。