我已经阅读了关于此的所有内容,但我仍然没有想出如何做到这一点。我正在尝试逐行读取.txt并将其放入数组中。我认为我的代码有点工作,但当我尝试打印阵列时它不会让我。
{{1}}
为什么有2个印刷品的原因是因为我试过两种方式来看看我是否可以修复它。 我知道自己做错了什么吗? 我得到的错误是“格式'%s'需要类型为'char *'的参数,但参数2的类型为'char **'
答案 0 :(得分:0)
你将声明列表作为指向char 的指针的数组20的数组196的原因是什么?代码似乎更可靠。
int main ( void )
{
static const char filename[] = "lista.txt";
FILE *file = fopen ( filename, "r" );
char list[196][20];
int i = 0;
if ( file != NULL )
{
char line [ 128 ]; /* or other suitable maximum line size */
while ( fgets ( line, sizeof line, file ) != NULL ) /* read a line */
{
strcpy( list[i], line ); /* copy the line into list */
fputs ( line, stdout ); /* write the line */
++i;
}
fclose ( file );
}
else
{
perror ( filename ); /* why didn't the file open? */
}
return 0;
}
答案 1 :(得分:0)
getline()
is a standard POSIX function.
您的代码存在一些问题。
首先,您使用getline()
错误。通过传递固定大小的数组元素的地址并将其作为大小调零,getline()
可能会尝试realloc()
您的指针,并且无法正常工作。
只要文件中有足够的行,这将有效:
#include<stdio.h>
#include<stdlib.h>
#include<omp.h>
int main(){
char *list[196];
size_t bytes[196];
FILE *lista;
lista=fopen("lista.txt","r");
if ( null == lista )
{
return( -1 );
}
// while(feof==0) is *so* wrong...
for ( int i = 0; i < 196; i++){
list[i] = NULL;
bytes[i] = 0;
// note that the address of list[i] and bytes[i] are
// passed - if you examine them after the call, you'll
// see they changed value. Since C is pass-by-value,
// the address must be passed to allow the variable in
// main to be modified by the getline() call
ssize_t bytes_read = getline(&list[i],&bytes[i],lista);
if ( bytes_read <= 0 )
{
break;
}
printf("%s\n",list[i]);
}
fclose(lista);
return(0);
}
while(feof==0)
在许多层面都是错误的。裸feof
计算feof()
函数的地址,并且永远不会等于零。假设你的意思是while (feof(lista)==0)
,那也是错的。有关原因,请参阅Why is “while ( !feof (file) )” always wrong?。
答案 2 :(得分:-1)
用你的方法试试......:
#include<stdio.h>
#include<stdlib.h>
#define MAX_LINES_NO 4096
int main(){
char *list[MAX_LINES_NO];
int i = 0;
FILE *lista;
lista=fopen("lista.txt","r");
size_t len = 0;
for(i=0; i< MAX_LINES_NO; ++i) list[i] = 0;
i=0;
while(-1 != getline(&list[i],&len,lista)){
printf("%s\n",list[i]);
++i;
}
for(i=0; i< MAX_LINES_NO; ++i) free(list[i]);
fclose(lista);
}
在这种方法中,您可以更改MAX_LINES_NO以动态分配指针数组。请注意,当buffer和len为0时,此方法依赖于getline特定的行为(它动态分配内存:http://man7.org/linux/man-pages/man3/getdelim.3.html)。