【问题标题】:Weird result when reading file读取文件时的奇怪结果
【发布时间】:2012-11-20 07:57:23
【问题描述】:

当我将文件中的信息读入我的电话簿程序并尝试通过联系人列表查看时,第一次尝试查看时列表为空白,但如果您选择再次查看,则文件在那里。更奇怪的是,当您通过程序添加名称时,该名称会与文件数据一起显示一次,但如果您再次检查,新名称就消失了。如果您删除一个姓名,它会删除一次,但如果您再次检查联系人列表,该姓名会恢复。我不知所措。这是我的读取函数和打印函数。

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

}

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

【问题讨论】:

  • 您的代码还不够——main() 呢?此外,您的打印例程正在调用您的加载例程,它打印了您的列表之后 - 这是不对的。

标签: c file function io malloc


【解决方案1】:

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

恐怕它真的只是好像它起作用了:

  • friends 在某处预分配?因为您只需继续从文件中读取输入并递增 i 直到文件末尾(或错误) - 这可能迟早会溢出;

  • 你读了 80 个字符,然后试着把它变成 36 个字符的 2 倍 - 这很容易再次溢出。更不用说将这些 80 读入通过多个函数作为参数传递的缓冲区 - 为什么不使用局部变量?幻数36 是更小、更大还是等于MAXNAME?为什么?

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

【讨论】:

    猜你喜欢
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多