请问以下文件与链表结合的代码该怎么写才能实现文件某一行数据的修改?
#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;
}
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");
}
望采纳。
只能对修改后的链表重新全部写进文件,不用改某一行,要改的话,你还要在文件的里面做行数标记
C语言修改文件中具体某一行的内容
借鉴下
https://jingyan.baidu.com/article/d5a880eb42f3aa53f047cc14.html