2014-09-16 3 views
1

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

Этот вопрос о чтении файла, строка за строкой, и вставить каждую строку в связный список.

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

ХОРОШО: вот мой вопрос

Как объединить эти понятия, и написать функцию, которая считывает текст из файла, строка за строкой и вставки каждой строки в качестве узла в связанный список?

При чтении из файла, я делаю следующее:

//Code for reading a file 
int c; 
while((c = getc(f))!= EOF) { 
    putchar(c); //Prints out the character 
} 
fclose(f); //Close the file 

The вставки() функции принимает два параметра, один из которых связанного узла списка, а второй из которых является ВаЬаЕпЬга (» строка "), которая должна храниться в этом узле.

void insert(node_lin *head, char *dataEntry) { ... } 

Следовательно, поскольку функция ЕОКП получает каждый символ отдельно, а putchar выписывает каждый символ на экран, я представляю код, чтобы сделать что-то вдоль этих линий:

  • Читать каждый символ до тех пор, конец файла (EOF)
  • Для каждого символа, до достижения новой строки ('\ n'), добавьте это к ранее прочитанным символам (строя строку)
  • Если вы достигнете конца строки, вставьте эту «строку» в связанный список
  • Повторяйте до достижения EOF

    //Code for reading a file 
    int c; 
    while((c = getc(f))!= EOF) { 
         //Build a string here consisting of characters from c, until reaching a new line. 
         /* 
         if(c == '\n') { //Indicates a new line 
          //Insert the line you have into the linked list: insert(myLinkedList, line); 
         } 
         */ 
    } 
    fclose(f); //Close the file 
    

Дела в том, я уже не имею рабочую read_file функции, а также функции рабочей вставки(). Мне нужна помощь в том, чтобы разделить файл на строки и вставить их.

Спасибо, ребята!

+1

Просто используйте 'fgets '. – someuser

+1

Или даже лучше, используйте [getline (3)] (http://man7.org/linux/man-pages/man3/getline.3.html), если ваша система имеет его. –

+1

Вы можете прочитать весь файл в одном блоке, затем заменить новые строки на 0 и создать свой список, чтобы указать на начало строк в блобе. – hyde

ответ

2

Замените показания по-символам чем-то более высоким уровнем.

  • Наиболее типичным вариантом будет fgets(), но для этого требуется указать статический предел для длины линии.
  • Если у вас есть getline() вы можете использовать это, он будет обрабатывать любую строку длину, но это POSIX, не standarc С.

Кроме того, вы должны изменить свою insert() функции, чтобы принять const char * в качестве второго аргумента (и не забудьте выделить память внутри и скопировать текст, конечно).

+0

'getline' является стандартным в Posix2008 (и Posix является стандартом) –

+0

@BasileStarynkevitch Правильно, поэтому я сказал« не как стандарт », так как считаю« C »более высоким стандартом, чем« POSIX ». – unwind

1

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

fgets (buffer, 128, f); 

При чтении из файла, вы можете сделать следующее:

//Code for reading a file 
char buffer[128];     // decide the buffer size as per your requirements. 
while((fgets (buffer, 128, f))!= NULL) { 
    printf (buffer); 
} 
fclose(f); //Close the file 
Смежные вопросы