gpt4 book ai didi

c - fwrite 和 fread 的问题

转载 作者:太空宇宙 更新时间:2023-11-04 06:37:48 27 4
gpt4 key购买 nike

我的 fwrite() 和 fread() 处理二进制文件有问题,这里是我的源代码,而底部是我的读写。现在,当我运行它时它返回“jake”,仅此而已。有人告诉我写一个转储缓冲区函数来处理二进制字符。此外这里还有文本文件,我正在写入一个名为 info.bin 的空白文件。 PS 我知道将 zip 保存为 int 是不好的做法,但这是我的教授所要求的。

文件:

mike|203-376-5555|7 Melba Ave|Milford|CT|06461
jake|203-555-5555|8 Melba Ave|Hartford|CT|65484
snake|203-555-5555|9 Melba Ave|Stamford|CT|06465
liquid|203-777-5555|2 Melba Ave|Barftown|CT|32154

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LINE 80
#define RECORDS 10


struct info{
char name[100];
char number[100];
char address[100];
char city[100];
char state[100];
int zip;
};

void dump_buffer(void *buffer, int buffer_size)
{
int x;

for(x = 0; x < buffer_size; x++)
{
printf("%c",((char *)buffer)[x]);
}
}

int i, j, seeker;

int main(int argc, char* argv[])
{
char *buffer;

struct info input_records[RECORDS];
int nrecs = 0;
unsigned long fileLen;
char line[LINE];
FILE *fp = NULL;
FILE *fpbin = NULL;
FILE *fpread = NULL;



if (argc != 2)
{
printf ("ERROR: you must specify file name!\n");
return 1;
}
/* Open file */
fp = fopen(argv[1], "r");
if (!fp)
{
perror ("File open error!\n");
return 1;
}

while (!feof (fp)) {
fgets(line, sizeof(line),fp);
char* tok = strtok(line, "|");

while(tok != NULL)
{
strcpy(input_records[nrecs].name, tok);
tok = strtok(NULL, "|");
strcpy(input_records[nrecs].number, tok);
tok = strtok(NULL, "|");
strcpy(input_records[nrecs].address, tok);
tok = strtok(NULL, "|");
strcpy(input_records[nrecs].city, tok);
tok = strtok(NULL, "|");
strcpy(input_records[nrecs].state, tok);
tok = strtok(NULL, "|");
input_records[nrecs].zip = atoi(tok);
tok = strtok(NULL, "|");
}
nrecs++;
}




fpbin = fopen("info2.bin", "wb");
if (!fp)
{
perror ("File open error!\n");
return 1;
}

for(i = 0; i < 4; i++)
{

fwrite(&input_records[i], sizeof(struct info), 200000, fpbin);

}

fclose(fpbin);



fpread = fopen("info2.bin", "rb");



fseek(fpread, 0, SEEK_END);
fileLen = ftell(fpread);
fseek(fpread, 0, SEEK_SET);

buffer = (char *)malloc(sizeof(struct info));

fread(buffer, fileLen, 1, fpread);


dump_buffer(buffer, sizeof(buffer));

fclose(fpread);

fclose(fp);
free(buffer);
return 0;
}

最佳答案

fwrite(&input_records[i], sizeof(struct info), 200000, fpbin);

你刚刚告诉了fwrite200000 * 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) ,这又是未定义的行为,如果fileLen足够大,可能会崩溃。

你应该让 fwrite 一个 大小为sizeof(struct info) 的对象每次,你应该分配fileLen您读入的缓冲区的字节数(或读入大小为 sizeof(struct info) 的 block )。你应该检查 fwrite 的返回值和 fread了解他们是否成功写入/读取所需数据并适本地处理故障。

fpbin = fopen("info2.bin", "wb");
if (!fp)
{

你查错了FILE*在这里,你不检查 fpread完全没有。

此外,您将错误的计数传递给了 dump_buffer ,

dump_buffer(buffer, sizeof(buffer));

bufferchar* , 所以 sizeof bufferchar* 的大小,通常是四个或八个字节。您应该在那里传递分配的缓冲区大小。

并且,在读取原始文件时,

while (!feof (fp)) {
fgets(line, sizeof(line),fp);

feof(fp)只有在到达文件末尾时尝试读取后才会变为真,您应该将循环条件更改为

while(fgets(line, sizeof line, fp) != NULL) {

最后,如果输入文件包含格式错误的数据或太长的行,您的标记化代码将严重失败。您还应该在那里添加检查,这样您就不会通过 NULLstrcpyatoi .

关于c - fwrite 和 fread 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12679961/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com