文件操作

1,文件:有限信息记录的集合。
  eg: note.txt
2,文件存储:只能在存储在外存中  

3,文件分类:

      1,文本文件:文件中存放的字符(Byte)

      2,二进制文件:存放的是二进制信息的文件

4,文件的路径:存放的位置

   文件名:一个文件的标识

5,操作文件:

      1,打开 例: FILE*  fp = fopen(" ./data.c","rb");

               注 : 打开失败,返回NULL;

      2,操作 (读,写)

      3,关闭

   注 : 可能文件读写不成功

6,文本文件:文件中存放的字符

  操作方式:

         r 只读打开:如果文件不存在,则打开失败,否则以只读打开

         w只写:如果文件不存在,则创建文件,否则截断为0(清空)再打开

         r+读写打开 

         w+读写打开 

         a追加 a+

         ***文本文件的结束符:EOF

         6.1写入:

                    fputc

                    fputs(char*,FILE*);

                    fprintf() 格式化输出;

             本质:  1,(只能存储二进制)文本文件的信息存储就是二进制.

             2,写入时:将字符转换ASCII码,存放,读取时再将ASCII转换为字符:EOF

         6.2读取:以读r

                1,打开文件fopen("路径","读");        //r        /r

                2,读取:

                        1,int fgetc(FILE*); 读取一个字符

                        2,fgets(char* buf,size,FILE);    读取一行

                        3,fscanf(FILE*,"format",...);//从文件中获取

                3,关闭:fclose();

        6.3 API: 

                1,获取文件的读写位置长度 :  ftell()

                2,修改文件的读写位置 : fseek();

                           int fseek(FILE *stream, long offset, int whence);

                                                  stream:文件

                                                  whence:文件的位置(SEEK_SET文件指针位置的头  当前位置SEEK_CUR SEEK_END文件的末尾)

                                                  offset:偏移量   (+后移  -前移)

                3,判断文件是否完成:指向EOF 

                                 feof();  feof没有到末尾返回0  到了末尾就返回1 .

7,二进制:信息都是以二进制信息存放到文件中
 操作文件步骤 :
    1、打开  fopen("路径","操作方式");

                            操作方式 :
                                   rb:以只读打开,如果文件不存在,则打开失败
                                   rb+ 以读写打开,如果文件不存在,则打开失败
                                   wb    以只写打开,如果文件不存在,则创建,否则截断
                                   wb+ 以读写打开,如果文件不存在,则创建,否则截断
                                   ab  读写以追加打开
                                   ab+

    2、操作(读,写)
            fread(void* ptr, size_t size, size_t nmemb,
                       FILE *stream) 
                       返回:读取的实际次数  size_t 
                       fwrite(void* ptr, size_t size, size_t nmemb,
                       FILE *stream);
                       ptr:数据的首地址
                       size:一次写入的长度
                       nmemb:写入的次数
                       stream:文件
                       返回:写入的实际次数
    3、关闭
             fclose();

   文本文件的操作 : 

   fputc  ftell   fseek   fprintf  使用 : 

#include<stdio.h>

struct msg
{
	char name[10];
	char sex;
	int id;
	float score;
};

void main()
{

//1打开test.txt  以只写打开  
	FILE* fp=fopen("./test.txt","w");
	if(NULL==fp)
	{
		printf("文件打开失败\n");
		return ;
	}
//2操作
/*
	fputc('a',fp);	
	fputc('b',fp);
	fputc('c',fp);
	//读取文件读写位置在那:
	long ilen=ftell(fp);
	printf("%d\n",ilen);
	//位移
	//fseek(fp,-3,SEEK_CUR);//从当前位置开始,向左偏移3个Byte
	fseek(fp,0,SEEK_SET);//移动文件的开头
	fputc('d',fp);		
	fputc('z',fp);		
*/
	//fputs("hello world\n",fp);
//	int a=97;//将a写入到文件中,文件为100   1-0000001  '1'---01100001
//	putc(a,fp);
//	putc(a/100+48,fp);	
//	putc((a/10)%10+48,fp);	
//	putc(a%10+48,fp);	
//	fprintf(fp,"abcdef 100 %d %f",a,3.14);
	//写入:
//	struct msg lf={"lifei",'m',1001011,100};
//	fprintf(fp,"name:%s sex:%c ID:%d score:%f\n",lf.name,lf.sex,lf.id,lf.score);
	struct msg e[5]={...};
	
//3关闭
	fclose(fp);
}

 

   fgetc  的使用 : 

#include<stdio.h>

void main()
{
//1、打开
	FILE* fp=fopen("./msg.data","r");//以只读打开
	//判断文件是否能打开成功
	if(NULL==fp)
	{
		printf("失败\n");
		return;
	}
//2、操作
	
/*
	char value=0;2
	//while(EOF!=value)
	while(0==feof(fp))//feof()没有到末尾返回0  到了末尾返回1
	{
		value=fgetc(fp);
		printf("%d %c\n",value,value);	
	}
*/
	char buf[100]="";
	fgets(buf,3,fp);//读取100个字符	
	printf("%s",buf);
	
//3、关闭
	fclose(fp);
}

 

   fscanf  fgets  的使用 : 

#include<stdio.h>

struct msg
{
	char name[20];
	char sex;
	int id;
	float score;
};

void main()
{
//1打开
	FILE* fp=fopen("./test.txt","r");
	if(NULL==fp)
	{
		printf("打开失败\n");
		return;
	}
//2操作
	struct msg m;
	fscanf(fp,"name:%s sex:%c ID:%d score:%f",m.name,&m.sex,&m.id,&m.score);//从文件中获取(读取)信息
	printf("%s %c %d %f\n",m.name,m.sex,m.id,m.score);
/*
	char buf[100]="";
	while(0==feof(fp))
	{
		fgets(buf,100,fp);//读取一行
		//获取一行,并打印屏幕上
		printf("%s",buf);
	}
*/	
//3关闭
	fclose(fp);
}

 

  将信息写入到文件(二进制)  fwrite 的使用 :

#include<stdio.h>

struct msg
{
	int id;
	char name[10];
};

void main()
{
//1文件操作步骤:  只写打开:
	FILE*fp =fopen("./data","wb");	
	if(NULL==fp)
	{
		printf("打开失败\n");
		return ;
	}
//2操作
	//将信息写入到文件:二进制
/*
	int a[10]={100,200,300,400,500,600,700,800,900,1000};
	int ilen=fwrite(&a,4,10,fp);//写的长度:每次写入的长度*次数
	printf("%d\n",ilen);
*/	
/*
	char buf[100]="helloworld";//[105][101][101]
	fwrite(buf,1,10,fp);	//1Byte*10次=10Byte
*/
	struct msg m={1001,"lifei"};
	fwrite(&m,1,sizeof(struct msg),fp);
	
//3关闭
	fclose(fp);
}

 

  二进制的读取文件 : fread 的使用 : 

#include<stdio.h>

struct msg 
{
	int id;
	char name[10];
};
void main()
{
//1打开
	FILE* fp=fopen("data","rb");
	if(NULL==fp)
	{
		printf("文件打开失败\n");
		return;
	}
//2操作
/*
	int id;
	while(fread(&id,1,4,fp)>0)
		printf("%d\n",id);
*/
	struct msg m;
	fread(&m,1,sizeof(struct msg),fp);
	printf("%d %s\n",m.id,m.name);
		

//3关闭
	fclose(fp);
	
}

 

习题 :     文本:

        int a=11的二进制存放到文件中

        显示:1011    (区分:字符与数字)  ‘1’  1

#include<stdio.h>
int er(FILE* fp,int a)
{
	if(a == 0)
		return 0;
	else
	{
		er(fp,a/2);    //使用递归来实现
		fputc(a%2+48,fp);
	}
}
void main()
{
	FILE* fp=fopen("./test.txt","wb+");
	if(NULL==fp)
	{
		printf("文件打开失败\n");
		return ;
	}
	int a=11;
	er(fp,a);	
	fclose(fp);
}

 

习题 :     文本:

        读取test.txt中的内容并存放到数组中

#include<stdio.h>

void main()
{
	FILE* fp=fopen("./test.txt","rb+");
	if(NULL==fp)
	{
		printf("失败\n");
		return ;
	}

	char buf[5]="";
	
	fgets(buf,5,fp);
	printf("%s",buf);

	fclose(fp);
}

 

习题 :       二进制:

               定义一个学生信息,将班级的学生信息写入到文件中(>5个学生)
               struct student
              {
                     int id;
                     char name[10];
                     float score;
              };

#include<stdio.h>

struct student
{
	int id;
	char name[10];
	float score;
};

void main()
{
	FILE* fp=fopen("./test.txt","rb+");
	if(NULL==fp)
	{
		printf("文件打开失败\n");
		return ;
	}

	struct student s[8]={{110,"chh",88},
			{111,"dls",99},
			{112,"ydd",84},
			{113,"dwm",89},
			{114,"cxh",76},
			{115,"eee",67},
			{116,"yyy",50},
			{117,"hui",68}};

	fwrite(&s,20,8,fp);

	fclose(fp);
}

 

习题 : 

        读取上题的文件,判断文件中有多少个人.

#include<stdio.h>

struct student
{
	int id;
	char name[10];
	int score;
};

void main()
{
	FILE* fp=fopen("./test.txt","rb+");

	struct student s;
	int i=0;
	while(0<fread(&s,1,sizeof(struct student),fp))
	{
		printf("%d\n",s.id);
		i++;
	}
	printf("文件中有%d个人\n",i);
	fclose(fp);
}

 

习题 : 

        读取上上题的文件,输出>60的人,且个数多少。且最高分是谁?

#include<stdio.h>

struct student
{
	int id;
	char name;
	int score;
};

void main()
{
	FILE* fp=fopen("./test.txt","rb+");
	struct student s;
	int j=0;
	while(0<fread(&s,1,sizeof(struct student),fp))
	{
		if(s.score>60)
		{
			j++;
		}
	}
	printf("一共有:%d大于60分",j);

	fclose(fp);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值