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

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

2 голосов
/ 07 декабря 2009

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

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

    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, когда я отслеживаю содержимое моего массива, каждый элемент в нем является просто последней строкой файла. Я думаю, это потому, что я просто помещаю один и тот же указатель (указывающий на другую строку в этот момент) в массив каждый раз, но в конце он будет указывать на последнюю строку, поэтому все будет последней строкой.

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

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

Ответы [ 4 ]

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

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

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

0 голосов
/ 07 декабря 2009

Вы можете использовать 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]);

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

0 голосов
/ 07 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...