Чтение файла построчно в C

Я пытаюсь написать некоторый код, который откроет файл, прочитает его содержимое построчно и сохранит каждую из этих строк в массиве.

Сначала я открываю файл и считаю количество строк, каждая из которых имеет фиксированную длину, поэтому я просто делаю это:

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

Пока это работает хорошо, 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);

Это, конечно, не работает: каждый из моих printf - это правильная строка плюс последняя строка файла, например, первый printf будет:

ФАЙЛ 2 LINEEEEEEE: "1-я строка файла" "последняя строка файла"

И после этого цикла for, когда я отслеживаю содержимое моего массива, каждый элемент в нем является просто последней строкой файла. Я думаю, это потому, что я просто помещаю один и тот же указатель (указывающий на другую строку в этот момент) в массив каждый раз, но в конце он будет указывать на последнюю строку, поэтому все будет последней строкой.

Как бы я решил мою проблему?

PS: Я только начал C, поэтому, пожалуйста, не думайте, что я знаю даже основные вещи об этом:(

4 ответа

Решение
  • Используйте stdio, т.е. fopen(), fgets() а также fclose() сделать ввод / вывод. Вы используете гораздо более низкий уровень ввода-вывода в стиле Posix, без веской причины.
  • Вам нужно будет динамически распределять каждую новую строку, чтобы сохранить ее в массиве. Ты можешь использовать strdup() сделать это.
  • Помните, что все может пойти не так; файлы могут не открываться, строки могут не читаться, а память может не выделяться. Проверьте это и действуйте соответственно.

Вы не создали массив строк, вы создали указатель на массив строк. вам нужно распределить ваш массив в part2 так, чтобы он был числом строк * числом символов в строке. затем переместите строки чтения в каждую последующую позицию массива.

[редактировать]
еще кое-что.....
ваши строки имеют длину X Строки 'C' имеют длину не X, а X+1:)
[/редактировать]

Почему бы не использовать fopen, тогда просто используйте fgets, чтобы получить каждую строку

Вы можете использовать stat, чтобы получить размер файла. затем number_of_lines = stat.st_size/LINE_LENGTH

Если вам не нужны строки символов с нулевым символом в конце, вы можете прочитать весь файл в один буфер. Настройте массив указателей, если вы действительно хотите их использовать, или просто используйте &buf[n * LINE_LENGTH] чтобы получить начало строки n.

Чтобы напечатать ненулевую завершенную строку известной длины, вы можете использовать:

printf("line %d = '%.*s'\n", n, LINE_LENGTH, &buf[n * LINE_LENGTH]);

Дайте мне знать в комментарии, если вы хотите увидеть реальный код.

Другие вопросы по тегам