-2
#include<stdio.h>
struct Node{
    char *name;
    int time;
    int sec; 
    int x;
    int y;
    struct Node *next;
};
int main(){
    FILE *file;
    int index;
    struct Node *data=malloc(sizeof(struct Node));
    struct Node *tmp=data,*tmp2=data;
    int enter;

    file=fopen("data.txt","r");

    if(file==NULL){
        printf("File was not opened!\n");
        return 0;
    }

    while(!feof(file)){
        tmp=malloc(sizeof(struct Node));
        fscanf(file,"%d",&index);
        fscanf(file,"%d",&tmp->time);
        fscanf(file,"%d",&tmp->sec);
        fscanf(file,"%d",&tmp->x);
        fscanf(file,"%d",&tmp->y);
        fscanf(file,"%s",tmp->name);
        fscanf(file,"%'\0",&enter);
        tmp->next=NULL;
        tmp=tmp->next;
    }
    fclose(file);
    while(tmp2 != NULL){
        printf("file:%d\t%d\t%d\t%d\t%s\n",tmp2->timestamp,tmp2->sec,tmp2->pointx,tmp2->pointy,tmp2->name);
        tmp2=tmp2->next;
    }
    return 0;
}

Need some help with reading data from a file and write them to the linked list and after that print the linked list to the secreen.But it stops working immedately after I start the program.In the file data is like that:

  • 1 28000 41 29 50 bbb
  • 2 29000 91 19 60 ccc
  • 3 30000 23 77 92 ddd
  • 4 30000 37 62 65 eee
  • 5 31000 14 45 48 fff

(there are tabs between them)

I read many questions but their answers didn't help me.I think I'm missing a point somewhere but I couldn't see the problem.Is it about reading a data directly to the linked list or something else? Thanks for help. //I'm looking at my code againt thanks for help**(edited)

F.B.
  • 1
  • 1
  • 1
    This `"%'\0"` is exactly the same as this `"%'"`, what is it supposed to do according to you? If you read the documentation, what do you think it will do? – Iharob Al Asimi Nov 06 '16 at 13:00
  • ".. it gives an error message .." Please **never** let us guess what specific error you get. – Jongware Nov 06 '16 at 13:09
  • BTW, you are still learning, and *you should read a lot* and experiment. Be aware that you need several days of full-time work on this homework. – Basile Starynkevitch Nov 06 '16 at 13:33
  • 1
    There are compilation errors in your code. For example: the code is trying to access pointx and pointy in the structure which does not exists. I agree with other people to take this problem as a learning opportunity and debug it more. Running it through gdb will be definitely fun.. – Jay Rajput Nov 06 '16 at 14:07

1 Answers1

3

The name field is a pointer, but you never allocate it. So

    fscanf(file,"%s",tmp->name);

is undefined behavior. You really should be very scared. Take a few hours to read Lattner's blog: what every C programmer should know about undefined behavior.

Perhaps you might use getline(3) if on a POSIX system to read a line, or else use fgets(3).

BTW, when I compile your code with all warnings & debug info (with gcc -Wall -g if using GCC) I'm getting many errors and warnings. You should improve your code till you get no warnings. Then you should use debugger (gdb) to find many other bugs. You'll be able the run your buggy program step by step and query some variables. You should draw on a chalkboard (or on a paper) what you believe is the model and shape of the memory (including heap) of the process running your program. You'll find several bugs. Read more about C dynamic memory allocation and virtual address space.

Also, #include <stdlib.h> is required when using malloc(3)

Please read the documentation of every function that you are using, notably for fscanf.

Notice that you forgot to handle failure of malloc; and I also recommend using perror(3) in failure cases. So at least replace tmp=malloc(sizeof(struct Node)); with

tmp = malloc(sizeof(struct Node));
if (!tmp) { perror("malloc Node"); exit(EXIT_FAILURE); };

PS. I hope you don't expect us to do your homework. Your program is extremely buggy, but you'll learn a lot by finding by yourself these bugs. Asking someone else is counterproductive.

Community
  • 1
  • 1
Basile Starynkevitch
  • 223,805
  • 18
  • 296
  • 547