c语言文件fscanf函数如何判断到达EOF和如何逐行输入

问题遇到的现象和发生背景

大一c语言,一个汽车零部件采购信息管理程序

问题相关代码,请勿粘贴截图

问题出现在

//用链表来记录和存储汽车零部件采购管理系统 
//每个采购信息包括:采购编号,零部件名称,采购日期,采购员,采购数量,采购单价,供货单位 


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct a 
{
    char stu_no[20];//采购编号 
    char stu_name[20];//零部件名称 
    char date[20];//采购日期 
    char crew[20];//采购员
    double price;//采购价格 
    int sum;//采购数量
    char company[20];//采购单位 
}elemtype;

//链表中每个节点的定义
typedef struct node
{
    elemtype data;//数据域 
    struct node *next;//指针 
}NODE; 

NODE *create();
void print(NODE *head); 
void insert(NODE *head);
void insertBypos(NODE *head);
void deleteBypos(NODE *head);
void showMenu();
void search_menu(NODE *head);
void num(NODE *head);
void name(NODE *head);
void crew(NODE *head);
void com(NODE *head); 
void search_menu2(NODE *head); 
void num2(NODE *head);
void data_menu(NODE *head);
void save(NODE *head);
void read(NODE *head);


void data_menu(NODE *head){//文件目录
    system("cls");
    printf("请选择你要进行的操作\n");
    printf("1.读取文件\n");
    printf("2.保存为文件(地址:D:/data)\n");
    printf("0.返回到主菜单\n");
     int a;
     while(1){
         fflush(stdin);
         scanf("%d",&a);
         if(a==1||a==2||a==0)
         break;
         else
         printf("你的输入有误,请重新输入:\n");
     } 
     switch(a){
         case 1:read(head);break;
         case 2:save(head);break;
         case 0:break;
     }
}

void save(NODE *head){//保存 
    
}

void read(NODE *head){//读取 
    system("cls");
    int i,x;
    FILE* fp;
    NODE *s,*p;
    char ch;
    
    
    printf("文件需要按照:采购编号;零部件名称;采购日期;采购员;采购价格;采购数量;采购单位\n的格式来写,每一行代表一条采购信息\n");
    char data[20];
    printf("请输入文件地址:\n");
    scanf("%s",data);
    x=strlen(data);
    for(i=0;i<x;i++){
        if(data[i]=='\\');
        data[i]='/';
        if ((fp = fopen(data, "r")) == NULL){
        perror("读取失败\n");
        return ;
    }else{
        p=head->next;
        while(p->next!=NULL)//循环的作用是查找链表中最后一个结点 
    {
        p=p->next;
    }
        s=(NODE *)malloc(sizeof(NODE));
        while(1) {
            s->next=NULL;
        fscanf(fp,"%s;%s;%s;%s;%lf;%d;%s\n",s->data.stu_no,s->data.stu_name,s->data.date,s->data.crew,&s->data.price,&s->data.sum,s->data.company);
        p->next=s;
        if(fscanf(fp,"%s")!=0);
        }
    
    } 
}
}

运行结果及报错内容

因为不知道fscanf函数如何使用所以运行不了

我的解答思路和尝试过的方法

还没

我想要达到的结果

把目标文件的信息全部在链表的后面挂链

修改如下,供参考:

//用链表来记录和存储汽车零部件采购管理系统 
//每个采购信息包括:采购编号,零部件名称,采购日期,采购员,采购数量,采购单价,供货单位 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct a
{
    char stu_no[20];//采购编号 
    char stu_name[20];//零部件名称 
    char date[20];//采购日期 
    char crew[20];//采购员
    double price;//采购价格 
    int sum;//采购数量
    char company[20];//采购单位 
}elemtype;
//链表中每个节点的定义
typedef struct node
{
    elemtype data;//数据域 
    struct node* next;//指针 
}NODE;

NODE* create();
void print(NODE* head);
void insert(NODE* head);
void insertBypos(NODE* head);
void deleteBypos(NODE* head);
void showMenu();
void search_menu(NODE* head);
void num(NODE* head);
void name(NODE* head);
void crew(NODE* head);
void com(NODE* head);
void search_menu2(NODE* head);
void num2(NODE* head);
void data_menu(NODE* head);
void save(NODE* head);
void read(NODE* head);

void data_menu(NODE* head) {//文件目录
    system("cls");
    printf("请选择你要进行的操作\n");
    printf("1.读取文件\n");
    printf("2.保存为文件(地址:D:\\\\data)\n");
    printf("0.返回到主菜单\n");
    int a;
    while (1) {
        scanf("%d", &a);
        if (a == 1 || a == 2 || a == 0)
            break;
        else
            printf("你的输入有误,请重新输入:\n");
    }
    switch (a) {
    case 1:read(head); break;
    case 2:save(head); break;
    case 0:break;
    }
}

void save(NODE* head) {//保存 
    FILE* fp;
    char data[20];
    printf("请输入文件地址:\n");
    scanf("%s", data);
    if ((fp = fopen(data, "w")) == NULL) {
        perror("读取失败\n");
        return;
    }
    else {
        NODE* p = head->next;
        while (p) {
            fprintf(fp, "%s %s %s %s %lf %d %s\n", p->data.stu_no, p->data.stu_name,
                p->data.date, p->data.crew, p->data.price, p->data.sum, p->data.company);
            p = p->next;
        }
    }
}

void read(NODE* head) {//读取 
    system("cls");
    int i, x;
    FILE* fp;
    NODE* s, * p;
    char  data[20];

    printf("文件需要按照:采购编号;零部件名称;采购日期;采购员;采购价格;采购数量;采购单位\\n的格式来写,每一行代表一条采购信息\n");
    printf("请输入文件地址:\n");
    scanf("%s", data);
    if ((fp = fopen(data, "r")) == NULL) {
        perror("读取失败\n");
        return;
    }
    else {
        p = head;
        while (p->next != NULL)//循环的作用是查找链表中最后一个结点 
        {
            p = p->next;
        }
        while (1) {
            s = (NODE*)malloc(sizeof(NODE));
            s->next = NULL;
            if (fscanf(fp, "%s %s %s %s %lf %d %s\n", s->data.stu_no, s->data.stu_name,
                s->data.date, s->data.crew, &s->data.price, &s->data.sum, s->data.company) != 7)  break;;
            p->next = s;
            p = s;
        }
        free(s);
    }
}
int main()
{
    NODE* head = (NODE*)malloc(sizeof(NODE));
    head->next = NULL;
    data_menu(head);
    return 0;
}