2301_79937166 2023-12-28 11:38 采纳率: 80%
浏览 7
已结题

文件指针的使用与注意事项

1.请改这段代码到能够运行
2.这个代码和链表是混着的
3.二进制文件怎么打开与改写

#include <stdio.h>
typedef struct FamilyMember {
    char name[10]; //name
    short age; //age
    double weight;//weight
    char type[10]; //cat dog human or others
    struct FamilyMember* next;
};

void printFamilyMember(struct FamilyMember* p);
void printFamilyList(struct FamilyMember* head);
void inputFamilyMember(struct FamilyMember* p);
struct FamilyMember* insertListAtTail(struct FamilyMember* head, struct FamilyMember* node);
struct FamilyMember* insertListAtHead(struct FamilyMember* head, struct FamilyMember* node);
struct FamilyMember* deleteNodeFromList(struct FamilyMember* head, int age);

int main(int argc, char* argv[]) {
    struct FamilyMember* head = NULL;
    struct FamilyMember* pMember;
    char* filename;
    FILE* pFILE;
    int i = 0;

    filename = "FamilyList.bi";
    pFile=fopen_(&pFile, filename, "rb");
    if (pFile == NULL) {
        printf("Error happened when open file %s \n", filename);
    }
    // 简单但有bug
    while (!feof(pFile))            //当未读取文件尾标志
    {
        pNode = (struct FamilyMember*)malloc(sizeof(struct FamilyMember));
        fread(pNode, sizeof(*pNode), 1, pFile);
        pNode->next = NULL;
        head = insertListAtTail(head, pNode);
    }
    fclose(pFile);
    printFamilyList(head);
    return 0;
}

for (i = 0; i < 5; i++) {
    pMember = (struct FamilyMember*)malloc(sizeof(struct FamilyMember));
    inputFamilyMember(pMember);
    pMember->next = NULL;
    head = insertListAtTail(head, pMember);
}
printFamilyList(head) {

    head = deleteNodeFromList(head, 5);
    printf("after\n");
    printFamilyList(head);
    return 0;

}
    }

    void printFamilyMember(struct FamilyMember* p) {

        printf("名字:%s\n", (*p).name);
        printf("年龄:%d\n", (*p).age);
        printf("体重:%.2lf\n", (*p).weight);
        printf("种类:%s\n\n", (*p).type);
        //please finish 
        return;
    }

    void inputFamilyMember(struct FamilyMember* p) {
        printf("pelase input name age weight type in order\n ");
        scanf_s("%s", p->name, sizeof(p->name));
        scanf_s("%d", &(p->age));
        scanf_s("%lf", &(p->weight));
        scanf_s("%s", p->type, sizeof(p->type));
        return;
    }


  • 写回答

19条回答 默认 最新

  • 社区专家-Monster-XH 2023-12-28 11:56
    关注
    获得0.60元问题酬金

    基于Monster 组和AIGC的调写:若有帮助,还望采纳~~:

    • 源代码问题:
      文件指针命名不一致:pFile 和 pFILE 应保持一致。
      pNode 未定义:在读取文件时,应定义 struct FamilyMember* pNode;。
      fopen_ 应更正为 fopen。
      对 feof 的使用有误:在读取文件时,应检查 fread 的返回值。
      printFamilyList 和 main 函数的布局有误:for 循环和 printFamilyList 应在 main 函数内部。
      scanf_s 在标准 C 中不可用,应使用 scanf 或者 fgets 和 sscanf 组合。

    修改后的代码;

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct FamilyMember {
        char name[10];
        short age;
        double weight;
        char type[10];
        struct FamilyMember* next;
    } FamilyMember;
    
    void printFamilyMember(FamilyMember* p);
    void printFamilyList(FamilyMember* head);
    void inputFamilyMember(FamilyMember* p);
    FamilyMember* insertListAtTail(FamilyMember* head, FamilyMember* node);
    
    int main(int argc, char* argv[]) {
        FamilyMember* head = NULL;
        FamilyMember* pMember;
        FamilyMember* pNode;
        char* filename = "FamilyList.bi";
        FILE* pFile = fopen(filename, "rb");
        if (pFile == NULL) {
            printf("Error happened when open file %s\n", filename);
            return 1;
        }
    
        while (1) {
            pNode = (FamilyMember*)malloc(sizeof(FamilyMember));
            if (fread(pNode, sizeof(FamilyMember), 1, pFile) != 1) {
                free(pNode);
                break;
            }
            pNode->next = NULL;
            head = insertListAtTail(head, pNode);
        }
        fclose(pFile);
        printFamilyList(head);
    
        for (int i = 0; i < 5; i++) {
            pMember = (FamilyMember*)malloc(sizeof(FamilyMember));
            inputFamilyMember(pMember);
            pMember->next = NULL;
            head = insertListAtTail(head, pMember);
        }
    
        printFamilyList(head);
        return 0;
    }
    
    void printFamilyMember(FamilyMember* p) {
        printf("名字:%s\n", p->name);
        printf("年龄:%d\n", p->age);
        printf("体重:%.2lf\n", p->weight);
        printf("种类:%s\n\n", p->type);
    }
    
    void inputFamilyMember(FamilyMember* p) {
        printf("请输入名字、年龄、体重、种类:\n");
        scanf("%9s", p->name);
        scanf("%hd", &p->age);
        scanf("%lf", &p->weight);
        scanf("%9s", p->type);
    }
    
    void printFamilyList(FamilyMember* head) {
        FamilyMember* current = head;
        while (current != NULL) {
            printFamilyMember(current);
            current = current->next;
        }
    }
    
    FamilyMember* insertListAtTail(FamilyMember* head, FamilyMember* node) {
        if (head == NULL) {
            return node;
        }
    
        FamilyMember* current = head;
        while (current->next != NULL) {
            current = current->next;
        }
    
        current->next = node;
        return head;
    }
    
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 1月5日
  • 创建了问题 12月28日

悬赏问题

  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请
  • ¥15 有人知道怎么在R语言里下载Git上的miceco这个包吗
  • ¥15 GPT写作提示指令词
  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
  • ¥20 关于DAC输出1.000V对分辨率和精度的要求
  • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题
  • ¥15 哪位能做百度地图导航触点播报?