YumeNoTsuduki 2022-03-06 16:40 采纳率: 100%
浏览 49
已结题

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函数如何使用所以运行不了

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

还没

我想要达到的结果

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

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2022-03-07 15:19
    关注

    修改如下,供参考:

    //用链表来记录和存储汽车零部件采购管理系统 
    //每个采购信息包括:采购编号,零部件名称,采购日期,采购员,采购数量,采购单价,供货单位 
    #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;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月23日
  • 已采纳回答 3月15日
  • 创建了问题 3月6日

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加