我如何在C中逐行读取.txt?

时间:2016-11-13 23:19:47

标签: c string file

我已经阅读了关于此的所有内容,但我仍然没有想出如何做到这一点。我正在尝试逐行读取.txt并将其放入数组中。我认为我的代码有点工作,但当我尝试打印阵列时它不会让我。

{{1}}

为什么有2个印刷品的原因是因为我试过两种方式来看看我是否可以修复它。 我知道自己做错了什么吗? 我得到的错误是“格式'%s'需要类型为'char *'的参数,但参数2的类型为'char **'

3 个答案:

答案 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)。