利用fputc 、fgetc实现文件的拷贝
int main(int argc, const char *argv[])
{
FILE* rfp=fopen(argv[1],"r");
FILE* wfp=fopen(argv[2],"w");
if(rfp==NULL || wfp==NULL)
{
perror("fopen");
return 1;
}
while(1)
{
char res=fgetc(rfp);
if(feof(rfp)==1)
{
break;
}
fputc(res,wfp);
}
fclose(rfp);
fclose(wfp);
return 0;
}
将链表中数据拷贝到文件中,再将文件内容拷贝入链表
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Data
{
char name[32];
int age;
int score;
}data_t;
typedef struct Student
{
union studata
{
struct Student* tail;//在头节点里面,用来存放尾节点指针
data_t val;
}data;
struct Student* next;
}stu_t;
// 创建头节点
stu_t* create_head()
{
stu_t* head = (stu_t*)malloc(sizeof(stu_t));
memset(head,0,sizeof(stu_t));
head->data.tail = head;// 只有头节点的时候,尾节点就是头节点本身
head->next = NULL;
return head;
}
// 创建普通节点
stu_t* create_node()
{
stu_t* newnode = (stu_t*)malloc(sizeof(stu_t));
memset(newnode,0,sizeof(stu_t));
return newnode;
}
// 向链表中添加一个新的节点
void insert_node(stu_t* head,data_t data)
{
stu_t* newnode = create_node();
newnode->data.val = data;
head->data.tail->next = newnode;
head->data.tail = newnode;
newnode->next = NULL;
}
void show(stu_t* head)
{
stu_t* p = head->next;
printf("学生信息如下:\n");
while(p != NULL)
{
printf("姓名:%s 年龄:%d 成绩:%d\n",p->data.val.name,p->data.val.age,p->data.val.score);
p = p->next;
}
printf("------------------\n");
}
void save_stu(stu_t* head)
{
FILE* fp = fopen("./1.c","w");
if(fp == NULL){return;}
stu_t* p = head->next;
while(p != NULL)
{
fprintf(fp,"%s %d %d\n",p->data.val.name,p->data.val.age,p->data.val.score);
p = p->next;
}
fclose(fp);
}
void load_stu(stu_t* head)
{
FILE* fp = fopen("./1.c","r");
if(fp == NULL){return ;}
while(1)
{
// 准备一个临时的学生数据域,用来保存从文件中读取到的信息
data_t data = {0};
int res = fscanf(fp,"%s %d %d\n",data.name,&data.age,&data.score);
if(feof(fp)==1){break;}
insert_node(head,data);
}
fclose(fp);
}
int main(int argc, const char *argv[])
{
stu_t* head = create_head();
load_stu(head);
int num=0;
while(1)
{
printf("1:添加学生\n");
printf("2:查看学生信息\n");
printf("3:保存学生信息\n");
printf("请选择:");
scanf("%d",&num);
printf("------------------\n");
getchar();
switch(num)
{
case 1:
{
data_t data;
printf("请输入学生姓名、年龄、成绩:");
scanf("%s %d %d",data.name,&data.age,&data.score);
printf("------------------\n");
insert_node(head,data);
break;
}
case 2:
show(head);
break;
case 3:
save_stu(head);
break;
default:
break;
}
}
return 0;
}
结果如下: