在C中逐行读取文件

JoO*_*oOb 2 c arrays storage file line

我正在尝试编写一些代码来打开文件,逐行读取其内容并将这些行存储到一个数组中.

首先,我打开文件并计算行数,每行都是固定长度,所以我只是这样做:

    char buf2[LINE_LENGTH];
    int in2 = open("toSend2", O_RDONLY);
    int number_of_lines = 0;

    for (;;)
 {
  char* p2 = buf2;
  int count = read (in2, p2, LINE_LENGTH);
  if (count < 0)
  {
    printf("ERROR");
    break;
  }
  if (count == 0) break; 

  number_of_lines++;

  printf("count: %d \n",count);
  printf("File 2 line : %s", p2);
  printf("\n");

 }
 close (in2);
Run Code Online (Sandbox Code Playgroud)

到目前为止,这很有效,number_of_lines确实是文件"toSend2"中的行数,而我的每个printf都是该文件中包含的行.

现在有了行数,我创建了一个字符串数组,然后我基本上再次遍历整个文件,但这一次,我想将每一行存储在数组中(可能有更好的方法来查找数字文件中的行,但我尝试的所有内容都失败了!)

    char * array[number_of_lines];
    int b=0;
    int in3=0;
    in3 = open("toSend2", O_RDONLY);
    for (;;)
 {
  char* p3 = buf3;
  int count = read (in2, p3, LINE_LENGTH);
  if (count < 0)
  {
    printf("ERRORRRRRR");
    break;
  }
  if (count == 0) break;


  array[b] = p3;
  b++;

  printf("count: %d \n",count);
  printf("FILE 2 LINEEEEEE : %s", p3);
  printf("\n");

 }  
 close(in3);
Run Code Online (Sandbox Code Playgroud)

当然,这不起作用:我的每个printf都是正确的行加上文件的最后一行,例如,第一个printf将是:

FILE 2 LINEEEEEEE:"文件的第一行""文件的最后一行"

在这个for循环之后,当我跟踪我的数组的内容时,它中的每个项目都只是文件的最后一行.我想这是因为我每次只是在数组中放入相同的指针(指向那一刻的不同行),但最后它将指向最后一行,因此一切都将是最后一行.

我该如何解决我的问题?

ps:我刚刚开始使用C,所以请不要假设我甚至都知道它的基本知识:(

unw*_*ind 6

  • 使用标准输入输出,即fopen(),fgets()fclose()做I/O.你没有充分的理由使用更低级别的Posix风格的I/O.
  • 您需要动态分配每个新行,以便将其存储在数组中.你可以strdup()用来做这件事.
  • 请记住事情可能会出错; 文件无法打开,行无法读入,内存可能无法分配.检查这一点,并采取相应的行动.