Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C fgets()-是否只将文件的最后一行写入数组?_C_Fgets - Fatal编程技术网

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

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);
文件*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;i
char*协议_数组[];
不能直接包含任何数据,只能包含指向分配内存的指针

您应该将
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;i
char数组[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[],则需要为每个元素分配内存。请小心。