C fgets()-是否只将文件的最后一行写入数组?
C语言中的fgets()有一个非常奇怪的问题。下面是我正在使用的代码C fgets()-是否只将文件的最后一行写入数组?,c,fgets,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);
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);
文件*conf_文件;
字符数组[20];
conf_file=fopen(“配置”、“r”);
如果(!conf_file)printf(“没有conf file”);
而(!feof(conf_文件)){
//if(feof(conf_文件))中断;
fgets(数组,20,conf_文件);
//printf(“%s”,数组);
如果(!read\u id\u标志){
labris_id=atoi(数组);
read_id_flag=1;
printf(“%d\n”,id);
继续;
}
协议_数组[协议_索引]=数组;
//printf(“%s%s”,数组,协议数组[协议索引];
协议_index++;
}
int i;
对于(i=0;iprotocol\u array[protocol\u index]=array;-这一行似乎是问题所在。您应该做一个strcpy
如果每次继续分配array,则只有array的地址(即本地数组)存储在protocol_array的所有元素中。从代码中可以明显看出,最后读取的行将出现在“array”中,因为protocol_array的所有元素都指向“array”的地址,它只打印所有元素的数据。协议数组[protocol\u index]=array;-这一行似乎是问题所在。您应该进行strcpy
如果每次继续分配array,则只有array的地址(即本地数组)存储在protocol_array的所有元素中。从代码中可以明显看出,最后读取的行将出现在“array”中,因为protocol_array的所有元素都指向“array”的地址,它只打印所有元素的数据。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 );
请注意,在后一种情况下,使用完所有分配的内存后,应释放:
for( i = 0; i<protocol_index; ++i )
free( protocol_array[i] );
free( protocol_array );
(i=0;ichar*协议_数组[];
不能直接包含任何数据,只能包含指向分配内存的指针
您应该将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 );
请注意,在后一种情况下,使用完所有分配的内存后,应释放:
for( i = 0; i<protocol_index; ++i )
free( protocol_array[i] );
free( protocol_array );
for(i=0;ichar数组[20];protocol\u数组[protocol\u index]=array;
这就是问题所在。我想我是这样做的。抱歉。有人帮我缩进了它。)@KarolyHorvath这有什么问题?我的意思是它是一个静态数组,在while范围内数组一次得到一行,我可以把它放在协议数组
中。但是在范围之下它不起作用。显示协议数组
的定义。很可能你六次给同一数组分配指针s、 这就是为什么在循环后会得到相同的内容-您在协议数组中的所有元素都指向相同的数组!协议数组声明:char*协议数组[];字符数组[20];协议数组[protocol\u index]=array;
这就是问题所在。我想是的。很抱歉。有人帮我缩进了。)@KarolyHorvath这有什么问题?我的意思是它是一个静态数组,在while范围内数组一次得到一行,我可以把它放在协议数组
中。但是在范围之下它不起作用。显示协议数组
的定义。很可能你六次给同一数组分配指针s、 这就是为什么在循环后会得到相同的内容-您在协议数组中的所有元素都指向相同的数组!协议数组声明:char*protocol\u数组[];但是,如果要进行strcpy,那么还应该为协议数组的每个元素分配一些内存,则需要为每个元素分配内存。请小心。但是,如果要进行strcpy,则还应该为协议数组的每个元素分配一些内存。如果协议数组为char*protocol\u array[],则需要为每个元素分配内存。请小心。