读文件时结果很奇怪

时间:2012-11-20 07:57:24

标签: c file function io malloc

当我从文件中读取信息到我的电话簿程序并尝试通过联系人列表查看时,第一次尝试查看时列表为空白,但如果您选择再次检查,则来自文件在那里。甚至更奇怪,当您通过程序添加名称时,名称会随文件数据一起显示一次,但如果再次检查,则新名称将消失。如果删除名称,则会删除一次,但如果再次检查联系人列表,则会返回该名称。我不知所措。这是我的阅读功能和我的打印功能。

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);

}

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

1 个答案:

答案 0 :(得分:0)

  

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

我担心它确实只是起作用了:

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

  • 你读了80个字符,然后尝试把它放到2个36个字符 - 这很容易再次溢出。没有提到将那些80读入缓冲区,通过几个函数作为参数传递 - 为什么不使用局部变量?幻数36是小于,大于还是等于MAXNAME?为什么呢?

  • 在循环的每次迭代中
  • malloc() tempfree()在完成后只发生一次 - 泄漏内存~120B /条目;