Связанный список с файлом IO - PullRequest
0 голосов
/ 30 января 2011
#include<stdio.h>
#include<conio.h>
#include <stdlib.h>
#include<string>

struct link_list {
    char mail[50];
    int counter;
    struct link_list *next; 
               };

    typedef struct link_list node;

    void main()
    {
        FILE *fp ; 
        char string1[80]; 
        node *head=NULL; 
        int count_length=0; 
        char *fname = "email.txt";
        fp = fopen ( fname, "r" ) ;
        char line [ 128 ]; /* or other suitable maximum line size */
            int count=0;

        while ( fgets ( line, sizeof line, fp ) != NULL ) /* read a line */ 
        {
            count++;
            if(head==NULL)
            {
                head=(node *)malloc(sizeof(node));
                fscanf(fp,"%s",string1);
                strcpy(head->mail,string1);
                head->counter=count;
                head->next=NULL;
            }
            else
            {
                node *tmp = (node *)malloc(sizeof (node));
                fscanf(fp,"%s",string1);
                strcpy(tmp->mail,string1);
                tmp->next = head;
                tmp->counter=count;
                head = tmp;
            }
        }

        fclose(fp); fp = fopen ( fname, "r" ) ;
        fclose(fp);
        //printf("%d",count_length);
        getch();
    }

Программа выдает ошибку подтверждения при запуске.Может ли кто-нибудь помочь мне отладить его?

Ответы [ 2 ]

0 голосов
/ 30 января 2011

node* head никогда не инициализируется.Поэтому if (head==NULL) всегда будет иметь значение false (это неопределенное поведение, поскольку оно не инициализировано)

Помимо того, что сказал Джефф Фостер, вы звоните fgets вместе с fscanf, который читает строкуфайл и затем чтение другого строкового значения.Поэтому, если fgets читает последнюю строку файла, ваш вызов fscanf не удастся.Это может быть как-то связано с ошибкой вашего утверждения.

0 голосов
/ 30 января 2011

Эта строка читает из файла в буфер с именем line

gets ( line, sizeof line, fp ) != NULL

Внутренний бит цикла, вероятно, должен что-то делать с этой строкой?Вместо того чтобы использовать fscanf для чтения из указателя файла, как насчет использования «sscanf» для чтения из строки, которую вы только что прочитали?

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

...