C fgets() - 只将文件的最后一行写入数组?

时间:2012-03-05 09:26:42

标签: c fgets

我在C中的fgets()有一个非常奇怪的问题。下面是我正在使用的代码。

FILE* conf_file;
char array[20];
conf_file=fopen("configuration","r");
if (!conf_file) printf("There is not conf file");
while(!feof(conf_file)){
    // if( feof(conf_file)) break;
    fgets(array,20,conf_file);
    //printf("%s",array);
    if (!read_id_flag){
        labris_id=atoi(array);
        read_id_flag=1;
        printf("%d\n",id);
        continue;
    }
    protocol_array[protocol_index]=array;
    // printf("%s %s",array,protocol_array[protocol_index]);
    protocol_index++;
}
int i;
for(i=0;i<10;i++){
    printf("%s",protocol_array[i]);
}
fclose(conf_file);

嗯,在while范围内,如果我尝试打印protocol_array,它的效果非常好。但是如果我尝试在while作用域之后打印数组,它只打印数组的最后一行,6次(6是文件中的行数)。

任何想法都表示赞赏。提前谢谢。

2 个答案:

答案 0 :(得分:1)

除了指向已分配内存的指针外,

char* protocol_array[];不能直接包含任何数据。

您应该将protocol_array定义为char protocol_array[20][6];,为长度为20的6行字符串和strcpy分配存储空间,如下所示:

char protocol_array[20][6];
//...
strcpy( protocol_array[protocol_index], array );

或通过malloc分配内存:

char** protocol_array = malloc( 6 * sizeof( char* ) );
//...
protocol_array[protocol_index] = malloc( strlen(array)+1 );
strcpy( protocol_array[protocol_index], array );

请注意,在后一种情况下,完成后应该free任何已分配的内存:

for( i = 0; i<protocol_index; ++i )
    free( protocol_array[i] );
free( protocol_array );

答案 1 :(得分:0)

protocol_array [protocol_index] =阵列; - 这条线似乎是问题所在。你应该做一个strcpy。

如果每次都继续分配数组,只有数组的地址(本地数组)存储在protocol_array的所有元素中。从代码中可以看出,最后一行读取行将出现在“数组”中,并且由于protocol_array的所有元素都指向“数组”的地址,因此它只会为所有元素打印出来。