拷贝文件的一些操作

利用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;
}

结果如下: 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值