飞到宇宙 2022-12-30 14:19 采纳率: 100%
浏览 34
已结题

文件与链表结合怎么修改文件某一行数据?

请问以下文件与链表结合的代码该怎么写才能实现文件某一行数据的修改?

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
#define LEN sizeof(struct Member)
struct Member
{
    int memnum;
    char name[50];
    long long idnum;
    long long telnum;
    float remain;
    struct Member *next;
};
void  SaveNode( struct  Member  *head, char *filename)
{
    struct  Member *p;
    if (head ==NULL)
    {
        printf("print nothing,data is NULL\n");
        return;
    }
    FILE *fp;
    fp=fopen(filename,"w");
    if (fp==NULL)
    {
        printf("error to write !");
        return;
    }
    p=head;
    do
    {
        fprintf(fp,"%d,%lld,%lld,%.2f,%s\n", p->memnum,p->idnum,p->telnum,p->remain, p->name);
        p=p->next;
    }
    while(p !=NULL);
    printf("save node datas to <%s>....Ok\n",filename);
    fclose(fp);
}
void PrintNode(struct  Member  *head)
{
   struct  Member *p=head;
   int n=0;
   if (head==NULL)
   {
       printf("\n List is NULL\n");
       return;
   }
   do
   {
        printf("%2d---%d,%lld,%lld,%.2f,%s\n", ++n,p->memnum,p->idnum,p->telnum,p->remain, p->name);
        p=p->next;
   }
    while(p !=NULL);
}
void PrintNode2(struct  Member  *head,long thenum)
{
   struct  Member *p=head;
   int n=0;
   if (head==NULL)
   {
       printf("\n List is NULL\n");
       return;
   }
   do
   {
      if(p->memnum==thenum) printf("%2d---%d,%lld,%lld,%.2f,%s\n", ++n,p->memnum,p->idnum,p->telnum,p->remain, p->name);
        p=p->next;
   }
    while(p !=NULL);
}
struct Member *AddNewNode(struct Member *head,struct Member *newNode)
{
    struct Member *p=head;
    if (head==NULL)
    {
        head=newNode;
        newNode->next=NULL;
        return head;
    }
    while (p->next!=NULL)
    {
        p=p->next;
    }
    p->next=newNode;
    newNode->next=NULL;
    return head;
}
struct Member *AddNewNodeFromFile(struct Member *head,char *filename)
{
    struct Member *p;
    FILE *fp;
    printf("Get data from file: %s...\n",filename);
    fp=fopen(filename,"r");
    if (fp==NULL)
    {
        printf("open file error!\n");
        return head;
    }
    p=( struct Member *) malloc(LEN);
    while(fscanf(fp,"%d,%lld,%lld,%.2f,%s",&p->memnum,&p->idnum,&p->telnum,&p->remain,p->name)!=EOF)
    {
        head=AddNewNode(head,p);
        p=( struct Member *) malloc(LEN);
    }
    fclose(fp);
    return head;
}
struct Member *AddNewNodeFromKeyboard(struct Member *head)
{
    struct Member *p;
    for (;;)
    {
        p=( struct Member *) malloc(LEN);
        printf("input new datas (End:0,0):\n");
        scanf("%d,%lld,%lld,%.2f,%s",&p->memnum,&p->idnum,&p->telnum,&p->remain,p->name);
        if (p->memnum==0)
        {
            free(p);
            break;
        }
        head=AddNewNode(head,p);
    }
    return head;
}
struct Member *FreeNodeSpace(struct Member *head)
{
    struct Member *p1,*p2;
    p1=head;
    while(p1!=NULL)
    {
        p2=p1->next;
        free(p1);
        p1=p2;
    }
    return NULL;
}
void DisplayMenu()
{
    printf("\n=====[ver 1.0 Menu]=============\n");
    printf("[A]-Display Current all Nodes\n");
    printf("[B]-Add New Node Datas\n");
    printf("[C]-reLoad Node Datas From File\n");
    printf("[D]-Save Node Datas to File\n");
    printf("[E]-Display a Node\n");
    printf("[Q]-Quit\n");
    printf("=================================\n");
}
int main(void)
{
    struct Member *nodehead=NULL;
    char readFilename[56]="C:\\D    C program\\address of homework\\MemberQuantity.txt";
    char saveFilename[30]="";
    long thenum;
    system("cls");
    nodehead=AddNewNodeFromFile(nodehead,readFilename);
    PrintNode(nodehead);
    for(;;)
    {
        DisplayMenu();
        switch(getch())
        {
            case 'A':
            case 'a':
                PrintNode(nodehead);
                break;
            case 'B':
            case 'b':
                nodehead=AddNewNodeFromKeyboard(nodehead);
                PrintNode(nodehead);
                break;
            case 'C':
            case 'c':
                nodehead= FreeNodeSpace(nodehead);
                nodehead=AddNewNodeFromFile(nodehead,readFilename);
                PrintNode(nodehead);
                break;
            case 'D':
            case 'd':
                printf("input the filename (data.txt):");
                gets(saveFilename);
                if (strlen(saveFilename)==0)strcpy(saveFilename,readFilename);
                SaveNode(nodehead, saveFilename);
                break;
            case 'E':
            case 'e':
                printf("Input the num:");
                scanf("%ld",&thenum);
                PrintNode2(nodehead,thenum);
                break;
            case 'Q':
            case 'q':
                printf("\nbye!\n");
                return(0);
        }
        fflush(stdin);
    }
return 0;
}

  • 写回答

4条回答 默认 最新

  • |__WhoAmI__| 2022-12-30 14:37
    关注

    1、先读取文件中的数据,并将其保存在链表中。你可以使用 AddNewNodeFromFile 函数来读取文件中的数据,然后将其添加到链表中。

    2、找到链表中需要修改的数据所在的节点。你可以使用链表的遍历函数(如 PrintNode 或 PrintNode2)来查找需要修改的节点。

    3、修改节点的数据。例如,你可以使用 scanf 函数来获取用户输入的新数据,然后将其赋值给节点的字段。

    4、将修改后的链表重新写入文件。你可以使用 SaveNode 函数将链表的数据保存到文件中。

    下面是一个例子:

    void modifyFile(struct Member *head)
    {
        int num;
        printf("请输入要修改的会员编号:");
        scanf("%d", &num);
    
        // 找到链表中需要修改的数据所在的节点
        struct Member *p = head;
        while (p != NULL && p->memnum != num)
        {
            p = p->next;
        }
    
        if (p == NULL)
        {
            printf("找不到指定的会员编号。\n");
            return;
        }
    
        // 修改节点的数据
        printf("请输入新的姓名:");
        scanf("%s", p->name);
    
        // 将修改后的链表重写入文件
        SaveNode(head, "member.txt");
        printf("修改成功!\n");
    }
    

    望采纳。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 1月7日
  • 已采纳回答 12月30日
  • 修改了问题 12月30日
  • 创建了问题 12月30日

悬赏问题

  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探