访问* head并从文件中读取

时间:2015-05-07 11:23:15

标签: c list file head

我正在编写一个程序,按字母顺序对文件中的行进行排序。 我想通过添加排序到动态分配的单向列表来做到这一点。 为了测试我创建了一个程序,它从fgetschar bufor[]读取文件中的行,然后我想将它添加到单向列表的开头,但是当我想检查{ {1}},然后我收到了错误消息。问题在哪里?

以下代码: 我做了结构

*head!=NULL

主要是:

 typedef struct LISTA lista;
    struct LISTA
    { char*line;
    lista* next;};

void check(int argc,char * argv[]) {
    if (argc < 2)
    {
      fprintf (stderr, "Uzycie: %s nazwa_pliku\n", argv[0]);
      exit (-1);
    } }
FILE* otworz_plikR(char* namef) // Otwieranie pliku w Trybie READ
{
    FILE* fp;
    fp = fopen(namef, "r");
    if (fp == NULL) {
        fprintf(stderr, "Cannot open source file!\n");
        exit(1);
    }
    else printf("Source file opened!\n");
    return fp;
}
lista* stworz_liste(char* namef) 
{
    lista **head=NULL;
    char bufor[100];
    char *line;
    lista *tmp;

    *head=NULL;

    size_t* len = 0;

    FILE* fp=otworz_plikR(namef);

    while(fgets(bufor,&len,fp)!=NULL)

    {
        line = (char*)malloc(sizeof(char)* (strlen(&bufor) + 1));

        strcpy(line, bufor);  

        printf("%s",line);

        tmp = (lista*)malloc(sizeof(lista));

        tmp->next=NULL;

        tmp->line=line;

        if (*head != NULL) tmp->next = *head;

        *head = tmp;
    }
    fclose(fp);
    free (bufor);
    free (len);
    fclose(fp);
}

感谢您的帮助。 argv [3] = output.txt argv [5] = input.txt。 也许你有其他问题要解决这个问题?

1 个答案:

答案 0 :(得分:1)

我简化了列表构建器功能,但添加了更多错误检查。该方法是创建每个新节点,将其链接到现有列表,并使其成为列表的新头。最后它返回列表指针。

lista *stworz_liste(char *namef) 
{
    lista *head = NULL;                                 // single indirection
    char bufor[100];
    lista *tmp;
    FILE* fp=otworz_plikR(namef);
    while(fgets(bufor, sizeof(bufor), fp) != NULL)      // replaced len
    {
        bufor [ strcspn(bufor, "\r\n") ] = 0;           // remove trailing newline
        tmp = malloc(sizeof(lista));                    // memory for list item
        if (tmp == NULL)
            exit(1);                                    // error
        tmp->line = malloc(strlen(bufor) + 1);          // simplify, remove &
        if (tmp->line == NULL)
            exit(1);                                    // error
        strcpy(tmp->line, bufor);  
        printf("%s\n",tmp->line);
        tmp->next = head;                               // link to current list
        head = tmp;                                     // new head of list
    }
    fclose(fp);
    //free (bufor);                                     // can't free this
    //fclose(fp);                                       // close once only
    return head;                                        // return head of list
}