gpt4 book ai didi

c - 读取文件时出现奇怪的结果

转载 作者:行者123 更新时间:2023-12-01 09:17:41 25 4
gpt4 key购买 nike

当我从一个文件中读取信息到我的电话簿程序中并尝试通过联系人列表查看它时,第一次尝试查看时该列表是空白的,但是如果您选择再次检查它,来自文件在那里。更奇怪的是,当你通过程序添加一个名字时,这个名字会和文件数据一起出现一次,但如果你再次检查它,新名字就不见了。如果你删除一个名字,它会删除一次,但如果你再次检查联系人列表,这个名字又回来了。我不知所措。这是我的读取功能和打印功能。

void file2(fr*friends ,int* counter, int i,char buffer[],FILE*read,char user_entry3[])
{
int len;
fr temp;
*counter=0;
i=0;
fseek(read, 0, SEEK_SET);
while (fgets(buffer, 80, read) != NULL) {
temp.First_Name=malloc(36); //was j+1
temp.Last_Name=malloc(36); //strlen(buffer));

sscanf(buffer,"%s %s",temp.First_Name,temp.Last_Name);

fgets(buffer, 20, read);
len=strlen(buffer);
if(buffer[len-1]=='\n')
buffer[len-1]='\0';

temp.home=malloc(20); //len);
strcpy(temp.home, buffer);

fgets(buffer, 20, read);
len=strlen(buffer);
if(buffer[len-1]=='\n')
buffer[len-1]='\0';


temp.cell=malloc(20); //len);
strcpy(temp.cell, buffer);

friends[i].First_Name=malloc(MAXNAME);
friends[i].Last_Name=malloc(MAXNAME);
friends[i].home=malloc(MAXPHONE);
friends[i].cell=malloc(MAXPHONE);

if(!friends[i].First_Name || !friends[i].Last_Name || !friends[i].home || !friends[i].cell) {
printf("\nmalloc() failed!\n");
getchar();
return;
}

strcpy(friends[*counter].First_Name,temp.First_Name);
strcpy(friends[*counter].Last_Name,temp.Last_Name);
strcpy(friends[*counter].home,temp.home);
strcpy(friends[*counter].cell,temp.cell);


(*counter)++;
i++;

}
//fclose(read);
free(temp.Last_Name);
free(temp.First_Name);
free(temp.home);
free(temp.cell);
}


void print_contact(fr*friends ,int* counter, int i,char buffer[],char user_entry3[50],FILE*read) {

for( i = 0; i < *counter; i++)

if (strlen(friends[i].First_Name) && strlen(friends[i].Last_Name)&& strlen(friends[i].home)&& strlen(friends[i].cell ))
{

getFirst(friends, i);
getLast(friends, i);
getHome(friends, i);
getCell(friends, i);



}
file2(friends ,counter,i,buffer,read,user_entry3);

}

这很奇怪,因为它就像程序一次完美运行,但之后就不行了。

最佳答案

It's weird because it's like the program works perfectly once, but then not again.

恐怕真的只是好像有效:

  • friends 是否已预先分配到某处?因为你只是继续从文件中读取输入并递增 i 直到文件末尾(或错误)——这迟早会溢出;

  • 您阅读了 80 个字符,然后尝试将其放入 36 个字符的 2 倍 - 这很容易再次溢出。更不用说将这 80 个读入一个缓冲区,该缓冲区作为参数通过多个函数传递——为什么不使用局部变量呢?魔数(Magic Number) 36 是小于、大于还是等于 MAXNAME?为什么?

  • malloc() temp 在循环的每次迭代中,但 free() 它在完成后仅执行一次 - 内存泄漏~120B/条目;

关于c - 读取文件时出现奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13468797/

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