文件操作

// ttt.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct FileHead
{
	double iVersion;
	char AuthorName[20];
	long fileLength;
	long HeadLength;
}FileHead;

typedef struct _student
{
		char szname[10];
		bool sex;
		double score;
}Stu;

typedef struct STU 
{
	int m_Num;
	float m_Score;
}STU;

typedef struct PNODE
{
	STU st;
	struct PNODE *next;
}SNode,*LPNODE;

bool FileCpy(const char *file1,char *file2);//练习6、文件复制,从file1中copy到file2中
void CrateFile(char *filename);//加入文件头的方式创建一个文件
void DataToFile(char *filename);//练习1、把data写入文件中  
void PrintToFile(char *filename);//练习2、把输入的字符串存入到文件中
void test3(const char *file1,const char *file2,char *file3);//练习3
void AddToFile(char *filename);//练习4、键盘输入4个学生数据,存入到文件

//练习5
bool  SaveToFile(LPNODE h,const char* fileName);
bool  LoadFromFile(LPNODE h,const char* fileName);
void InitNode(LPNODE h);
void DestroyNode(LPNODE h);//释放整条链表
void PrintNode(LPNODE h);


void main(int argc, char* argv[])
{
	char ch;
	while(true)
	{
	//	fflush(stdin);
		system("cls");
		printf("请选择...");
		printf("\n===================================");
		printf("\n1、练习1,把data写入文件中");
		printf("\n2、练习2、把输入的字符串存入到文件中");
		printf("\n3、练习3、将f1.txt、f2.txt中的数据存入f3.txt中");
		printf("\n4、练习4、键盘输入4个学生数据,存入到文件");
		printf("\n5、练习5、(1)把链表内容存入文件");
		printf("\n6、练习5、(2)把文件内容加载到链表中");
		printf("\n7、练习6、文件复制");
		printf("\n0、退出");
		printf("\n===================================\n");
		ch=getchar();
		switch(ch)
		{
		case '1':
			FILE *fp;
			//1、练习一
			DataToFile("test1.dat");
			printf("\n操作成功,数据已存入test1.dat中\n");
			//读出pc和stu的值
			fp=fopen("test1.dat","r");
			char pc2[12],stu2[32];
			fseek(fp,22,SEEK_SET);//22=2+10+(2*5)
			fgets(pc2,12,fp);
			fgets(stu2,32,fp);
			printf("获得pc是:%s\n获得stu是:%s\n",pc2,stu2);
			fclose(fp);
			break;
		case '2':
			//练习2
			printf("输入一串字符,以#结尾");
			PrintToFile("test2.txt");
			printf("操作成功,数据已存入test2.txt中\n");
			break;
		case '3':
				//练习3
			test3("fp1.txt","fp2.txt","fp3.txt");
			printf("操作成功,fp1.txt与fp2.txt数据存入到fp3.txt中\n");
			break;
		case '4':
			//练习4
			AddToFile("test4.txt");
			printf("操作成功,四个学生数据存入test4.txt中\n");
			break;
		case '5':
				//练习五
			LPNODE head;
			head=(LPNODE)malloc(sizeof(SNode));
			InitNode(head);
			SaveToFile(head,"text5.txt");//把链表内容存储到文件中	
			printf("操作成功,链表内容存入到文件中text5.txt\n");
			DestroyNode(head);			
			break;
		case '6':
			LPNODE pnew;
			pnew=(LPNODE)malloc(sizeof(SNode));
			LoadFromFile(pnew,"text5.txt");//把文件内容加载到链表中
			PrintNode(pnew);
			DestroyNode(pnew);
			break;
		case '7':
			FileCpy("tangwen.pdf","test6.pdf");
			printf("操作成功,tangwen.pdf的数据全部复制到test6.txt中\n");
			break;
		case '0':
			exit(0);
			break;
		default:
			printf("非法操作,请重新选择!\n");
			break;
		}
		printf("打回车键继续...");
		fflush(stdin);
		ch=getchar();
	}
}


bool FileCpy(const char *file1,char *file2)
{//文件复制,从file1中copy到file2中
	FILE *fp1,*fp2;
	fp1=fopen(file1,"rb");
	fp2=fopen(file2,"wb");

	if(!fp1 || !fp2)
		return false;

	char c[10]={0};
	while(!feof(fp1))
	{
		fread(c,1,sizeof(c),fp1);
		int n=fwrite(c,sizeof(c),1,fp2);
		//fputs(c,fp2);
	}

	fclose(fp1);
	fclose(fp2);

	return true;
}


void CrateFile(char *filename)
{//加入文件头的方式创建一个文件
	FILE *fp;
	if(!(fp=fopen(filename,"w+")))
		return;
	FileHead fh;
	strcpy(fh.AuthorName,"tangwen");
	fh.fileLength=1024;
	fh.iVersion=1.0;
	fh.HeadLength=sizeof(FileHead);

	fprintf(fp,"%f%s%ld%ld\n",fh.iVersion,fh.AuthorName,fh.fileLength,fh.HeadLength);

	fprintf(fp,"%-10s%-10s%-10s%-10s","1001","tangwen","yanzhou","changning");
	fclose(fp);
}

void DataToFile(char *filename)
{//练习1、把data写入文件中  
	FILE *fp;
	if(!(fp=fopen(filename,"wb")))
		return;
	char c='a';
	double d=12.3333;
	int ia[]={1,2,3,4,5};
	char *pc="hello world";
	Stu stu={"cjy",true,100.00};

	fprintf(fp,"%-2c%-10lf%-2d%-2d%-2d%-2d%-2d%-12s%-5s%-2d%-5.2f",c,d,ia[0],ia[1],ia[2],
		ia[3],ia[4],pc,stu.szname,stu.sex,stu.score);
	fclose(fp);
}


void PrintToFile(char *filename)
{//练习2、把输入的字符串存入到文件中
	FILE *fp;
	if(!(fp=fopen(filename,"w")))
		return;

	char ch;
	while((ch=getchar())!='#')
	{
		fputc(ch,fp);
	}

	fclose(fp);
}

void test3(const char *file1,const char *file2,char *file3)//练习3
{//将两个存有字符串的文件f1.txt、f2.txt中的数据读出,输入到新文件f3.txt中存放
	FILE *fp1,*fp2,*fp3;
	fp1=fopen(file1,"r");
	fp2=fopen(file2,"r");
	fp3=fopen(file3,"w");

	if(!fp1 || !fp2 || !fp3)
		return;
	char buffer[64];
	int nCount=0;
	while(!feof(fp1))
	{
		fgets(buffer,64,fp1);
		fputs(buffer,fp3);
	}
	while(!feof(fp2))
	{
		fgets(buffer,64,fp2);
		fputs(buffer,fp3);
	}

	fclose(fp1);
	fclose(fp2);
	fclose(fp3);
}


void AddToFile(char *filename)
{//键盘输入4个学生数据,存入到文件
	FILE *fp;
	if(!(fp=fopen(filename,"w+")))
		return;
	STU stu2[4];
	fprintf(fp,"%-8s%-10s\n","学号","分数");
	for(int i=0;i<4;i++)
	{
		printf("输入第%d个学生信息,学号,分数:",i+1);
		scanf("%d%f",&stu2[i].m_Num,&stu2[i].m_Score);
		fprintf(fp,"%-8d%-10.2f\n",stu2[i].m_Num,stu2[i].m_Score);
	}

	fclose(fp);
}


//练习5
bool  SaveToFile(LPNODE h,const char* fileName)
{
	FILE *fp;
	if(!(fp=fopen(fileName,"a+")))
	{
		if(!(fp=fopen(fileName,"w+")))
			return false;
	}
	LPNODE p;
	p=h->next;
	if(p==NULL)return false;
	while(p!=NULL)
	{
		fprintf(fp,"%-8d%-10.2f\n",p->st.m_Num,p->st.m_Score);
		p=p->next;
	}
	return true;
}

bool  LoadFromFile(LPNODE h,const char* fileName)
{
	FILE *fp;
	if(!(fp=fopen(fileName,"r")))
		return false;
	LPNODE p,pm;
	STU stu;
	char num[10],score[10];
	p=h;
	p->next=NULL;
	while(!feof(fp))
	{
		fscanf(fp,"%s%s",num,score);
		stu.m_Num=atoi(num);
		stu.m_Score=atof(score);
		pm=(LPNODE)malloc(sizeof(SNode));
		pm->st=stu;
		p->next=pm;
		p=pm;
		p->next=NULL;
	}

	return true;
}

void InitNode(LPNODE h)
{
	LPNODE p,pm;
	STU stu;
	p=h;
	p->next=NULL;
	printf("输入学生信息,以0结尾\n学号,成绩:");
	scanf("%d%f",&stu.m_Num,&stu.m_Score);
	while(stu.m_Num!=0)
	{
		pm=(LPNODE)malloc(sizeof(SNode));
		pm->st=stu;
		p->next=pm;
		p=pm;
		p->next=NULL;
		printf("学号,成绩:");
		scanf("%d%f",&stu.m_Num,&stu.m_Score);
	}
}

void DestroyNode(LPNODE h)//释放整条链表
{
	LPNODE p1,p2;
	p1=h;
	while(p1->next!=NULL)
	{
		p2=p1->next;
		free(p1);
		p1=NULL;
		p1=p2;
	}
	free(p1);
	p1=NULL;
}

void PrintNode(LPNODE h)
{
	LPNODE p;
	p=h->next;
	while(p!=NULL)
	{
		printf("%-8d%-10.2f\n",p->st.m_Num,p->st.m_Score);
		p=p->next;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值