Как читать содержимое файла в структуру построчно в C - PullRequest
1 голос
/ 14 февраля 2011

Здесь я пытаюсь прочитать содержимое файла построчно и создать структуру для каждой строки. Проблема в том, что когда я печатаю список слов, каждое из них является последним словом в файле (которое в этом примере}). Я считаю, что поскольку строка часто изменяется, и я передаю указатель на символ, значение каждой структуры также изменяется. Я пытался решить эту проблему в течение почти дня без какой-либо удачи. Какой хороший способ прочитать каждое слово в структуре и связать каждую структуру со связанным списком?

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

Структура токена

    typedef struct token
    {
     char* value;
     struct token* next;
    }TOKEN;

Содержимое файла

 target1:
 dependency1
 {
 command1,
 command2
 }

Main

    TOKEN *head = NULL;
// represents each formatted line from the script file
char* line = malloc(161*sizeof(char));

FILE* fileRead = openFile("RawRules.txt", "r");

while((line = readLine(line, fileRead)) != NULL) 
{
    head = add(head, line);
}

displaylist(head);
freeNodes(head);
fclose(fileRead);

Добавить функцию Изменено с http://cprogramminglanguage.net/singly-linked-list-c-source-code.aspx

 TOKEN* add(TOKEN *head, char* value){
 TOKEN *tmp;

if(head == NULL){
    head=(TOKEN *)malloc(sizeof(TOKEN));
    if(head == NULL){
        printf("Error! memory is not available\n");
        exit(0);
    }
    head-> value = value;
    head-> next = head; 
}else{
    tmp = head;

    while (tmp-> next != head)
        tmp = tmp-> next;
    tmp-> next = (TOKEN *)malloc(sizeof(TOKEN)); 
    if(tmp -> next == NULL)
    {
        printf("Error! memory is not available\n");
        exit(0);
    }
    tmp = tmp-> next;
    tmp-> value = value;
    tmp-> next = head;
}
return head;

}

функция чтения строки

 // reads a line of a file into buffer
 char* readLine(char* buffer, FILE* file) {
buffer = fgets(buffer, 161, file);
return buffer;
 }

Это также не решило проблему

    while(true) 
{
    char* ll = malloc(161*sizeof(char));
    ll = readLine(ll, fileRead);

    f(ll != NULL)
        head = add(head, ll);
    else 
        break;
}

Извините, я программировал на C, как миллиард лет назад, поэтому назовите меня нубом!

1 Ответ

2 голосов
/ 14 февраля 2011

В функции add() вы просто присваиваете char *, а не выделяете новую память (а затем копируете) для каждой строки.Таким образом, каждый TOKEN в конечном итоге указывает на исходный буфер.Поскольку вы используете один буфер на верхнем уровне, вы перезаписываете его снова и снова.

Короче: вам нужен отдельный буфер для каждой строки.Один из способов (не обязательно лучший) заключается в следующем: add():

int len = strlen(value);

...

tmp->value = malloc(len+1); /* +1 for null terminator */
strncpy(tmp->value, value, len+1);

Помните, что в какой-то момент вам понадобится free() всех этих дополнительных буферов.

...