2012-03-05 46 views
1

我有一个非常奇怪的问题,在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); 

那么,在同时范围,如果我尝试打印它完美的protocol_array。但是,如果我试图在while范围之后打印数组,则只打印数组的最后一行,6次(6是文件中的行数)。

任何想法是赞赏。提前致谢。

+0

请缩进你的代码.. – 2012-03-05 09:29:32

+0

char array [20]; protocol_array [protocol_index] = array;'这就是问题所在。 – 2012-03-05 09:30:26

+0

我以为我做到了。对不起。有些人为我缩进。 ;) – mtndesign 2012-03-05 09:31:11

回答

1

char* protocol_array[];不能直接包含任何数据,除了指向分配的内存的指针。

你应该要么限定protocol_array作为char protocol_array[20][6];,6行字符串的长度为20和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); 
0

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

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

+0

我试过了,但我会再试一次。 – mtndesign 2012-03-05 09:38:32

+0

但是,如果你打算做一个strcpy,那么你还应该为protocol_array的每个元素分配一些内存。如果你的协议数组是char * protocol_array [],那么它需要为每个元素分配内存。小心一点。 – Jay 2012-03-05 09:40:39

相关问题