在C中读取和分隔行到链表

时间:2013-10-19 10:43:46

标签: c text linked-list strtok

我有一个看起来像这样的文本文件:

Author; Title 
Author; Title 
etc...

我需要打开此文件并将其逐行读入链接列表。到目前为止,我有这个,但我不知道如何使用strtok(),因为它没有正确读取。 有人可以帮帮我吗?

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>

struct node
{
   char* author;
   char* title;
   struct node* next;
};

int main()
{
    struct node *root;   
    struct node *c;     
    root = malloc( sizeof(struct node) );  
    root->next = 0;  
    c = root; 

    FILE *f;
    f = fopen("books.txt", "r");

    char line[255];
    while( fgets( line, sizeof(line),f) != NULL)
    {
        char *token = strtok(line, ";");
        while(token!=NULL)
        {
          fread( &c->author, sizeof( c->author ), 1, f );
          token = strtok(NULL, " ");
        }
        fread( &c->title, sizeof( c->title ), 1, f );
        //printf("%s",&c->author);
    }

    fclose(f);
    return 0;   
}

1 个答案:

答案 0 :(得分:0)

看起来不对。你总是需要:

  1. 阅读足够的数据。
  2. 解析数据。
  3. 从堆中分配内存。
  4. 复制数据。
  5. line变量只是一个临时缓冲区,而char *authorchar *title变量在没有分配内存的情况下无法生存。在您的代码中调用fread()完全是胡说八道。您已经调用了fgets(),这是您从文件中读取数据的位置。其余的应该只是字符串操作。

    一种典型的方法是将char *start指向您感兴趣的数据的开头,char *end指向您感兴趣的数据后面的第一个字符,然后请求堆分配的副本使用author = strndup(start, end-start)或使用malloc()memcpy()strncpy()的组合执行相同操作。