C语言学习第十五课(文件操作)

第十五课

1,文件的概念

文件一般指存储在外部介质(如磁盘磁带)上的集合;

2,流的概念

·操作系统是以文件为单位对数据进行管理的,输入输出是数据传送的过程,数据如流水一般从一处流向另一处,因此将输入输出形象地称为流,即输入输出流;

·C语言把文件看作是一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。

·一个输入输出流就是一个字节流或者二进制流;

3,文件名
1,概念:一个文件要有一个唯一的文件标识,以便用户识别和引用;
2,组成:
    (1)文件路径//表示文件在外部存储设备中的位置;
    (2)文件标识:文件名字
    (3)文件后缀:表示文件的性质//如:txt、doc、c、cpp
4,文件分类

1,根据数据的组织形式,数据文件可分为ASCII文件和二进制文件;

·ASCII文件(文本文件):每一个字节放一个ASCII代码;

·二进制文件:把内存中的数据按照其在内存中的存储形式原样输出到磁盘上存放;

2,两种文件比较

·ASCII文件便于对字符进行逐个处理,也便于输出字符。但一般占存较多,需要转换时间;

·二进制文件可以节省空间和节约时间,但不能直接输出字符形式;

5,文本文件和二进制文件的区别

1,文本文件中数据是以字符形式呈现的,每一个字符占用一个 字符,而字节在计算机中又是以ASCII码来识别的;

例子:在内存中将整数 123 以文本形式存放;

‘1’(49)‘2’(50)‘3’(51)
0011 00010011 00100011 0011

2,二进制文件在存储数据时是直接以二进制方式进行的,这种存储形式与流相同;

例子:在内存中将整数 123 以二进制形式存放;(用short类型)

123(short)
0000 00000111 1011
6,文件缓冲区

ANSIC标准采用“缓冲文件系统”处理文件;

·缓冲文件系统:系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区;

·从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区之后才一起送到磁盘;

7,文件指针

1,C语言内置的文件指针类型 FILE*;

2,在标准输入输出库中,系统定义了三个FILE型的指针变量;

·stdin(标准输入文件指针):指向在内存中与键盘相应的文件信息区,意味着要用键盘输入;

·stdout(标准输出文件指针):指向在内存中与显示器屏幕相应的文件信息区,意味着输出到屏幕;

·stder(标准错误文件指针):用来输出错误文件的信息,输出到显示器屏幕;

8,文件的位置指针

1,位置指针用来指示当前的读写位置;

2,一般情况下,在对字符文件进行顺序读写时,文件的位置指针指向文件开头,

这时进行读操作,就读第一个字符,然后文件的位置指针顺序向后移一个位置,下一次执行度操作是,就将指针指向的第二个字符读入,以此类推,直到文件尾;

3,有时希望在一个文件的原有数据之后再添加新的数据,应该把文件位置指针移到文件尾,接着再写入新的数据,这就是文件的追加;

9,文件的打开与关闭
1,文件的打开(fopen函数)
    ·FILE* fp=fopen(文件名,操作方式);
    ·文件名:准备访问的文件的名字;
    ·操作方式:读还是写;
    ·让哪一个指针变量指向被打开的文件;
    【注意:使用时要判断】
    如:
    FILE* fp = fopen("666.txt", "w");
	if (fp==NULL)
	{
		perror("文件打开失败");
        return;
	}
	fclose(fp);
2,文件的关闭(fclose)【注意:每打开一个文件,使用完了必须相应的关闭文件】
    ·fclose(文件指针);
    ·功能:关闭文件,释放文件指针;
3,文件的操作方式
    ·"r" (只读)为输入打开一个文本文件   文件必须存在;
    ·"w" (只写)为输出打开一个文本文件   存在则删除重新建,不存在则创建;
    ·"a" (追加)向文本文件尾增加数据     文件必须存在;
    ·"rb" (只读)为输入打开一个二进制文件  文件必须存在;
    ·"wb" (只写)为输出打开一个二进制文件;
    ·"ab" (追加)向二进制文件尾增加数据;
    ·还可以在操作方式后加上 + 号,表示可读可写,如:r+,为可读可写; 
10,文件的顺序读写

1,逐个字符读写

1,向文件中写入字符
    ·fputc(ch,fp);
功能:将字符输出到fp所指向的文件中去;
返回值: 成功,返回输出的字符;
        失败,返回一个EOF2,从文件读取一个字符
    ·char ch;ch=fgetc(fp);
功能:从文件中获取一个字符,并赋值给ch;
返回值:如果在执行fgetc函数读字符时,遇到文件结束符,函数返回一个文件结束标志EOF(-1);

2,字符串读写

1,向文件中写入一个一个字符串;
    ·int fputs(const char* str,FILE *fp);
    ·返回值:成功,返回非负整数;
            失败,返回EOF(-1);
2,从文件中读取一个字符串;
    ·char* fgets(char* str,int n,FILE *fp);//n为读取字符串的大小
11,文件结束标志

1,EOF判断文件结束,EOF是一个宏(-1);

使用方法:
if(fgets(文件变量名)==EOF)//例子
{
    break;
}

2,feof(),如果读到文件结尾,会返回一个非零值,如果没有结束就会返回0

使用方法:
if(feof(文件指针变量名))
{
    break;
}
12,绝对路径和相对路径

1,相对路径:相对于程序来说,程序在那个目录,那么相对路径也在这个目录; 表示方式: “ . / ”,表示在当前路径下,可写可不写;

2,绝对路径:带盘符的路径,如:D:、C: ;

13,复制文件的操作
//具体例子
#include<stdio.h>
#include<string.h>
int main(int argc, char* argv[])
{
    //argc是命令行参数个数 
    //argv是命令行参数数组
	char total[BUFSIZ] = { 0 };
	if (argc == 3)
	{
		FILE* pdes = fopen(argv[1], "r");
		if (pdes == NULL)
		{
			perror("eroor");
			return -1;
		}
			while (!feof(pdes))
			{
				char buf[BUFSIZ] = { 0 };
				fgets(buf, BUFSIZ, pdes);
				strcat(total, buf);
			}
		fclose(pdes);
		FILE* parr = fopen(argv[2], "w+");
		if (parr == NULL)
		{
			perror("errpr");
			return -1;
		}
		int flag = fputs(total, parr);
		if (!flag)
		{
			printf("copy victory");
		}
		
		fclose(parr);

	}
	return 0;
}
14,复制图片操作
//具体例子
int main(int argc, char* argv[])
{
	char total[BUFSIZ] = { 0 };
	if (argc == 3)
	{
		FILE* pdes = fopen(argv[1], "rb");
        //【注意:因为图片是二进制文件,所以操作方式后要加b】
		if (pdes == NULL)
		{
			perror("eroor");
			return -1;
		}
		FILE* parr = fopen(argv[2], "wb");
		if (parr == NULL)
		{
			perror("errpr");
			return -1;
		}
		while (1)
		{
			char ch = fgetc(pdes);

			if (feof(pdes))
			{
				break;
			}
			fputc(ch, parr);
		}
		fclose(pdes);
		fclose(parr);
	}
	return 0;
}
15,格式化读写

1,向文件中格式化写数据;

​ ·fprintf(FILE* fp,char* Format,参数列表);

例子:fprintf(fp, “%d %d %s”, 999, 2222, “ol”);

2,从文件中格式化读取数据;

​ ·fscanf(FILE* fp,char* Format,参数地址列表);

例子:fscanf(fp, “%d %d %s”, &age, &hight,name);

16,文件的二进制读写

1,向文件写入二进制数据;

·fwrite(const*Buffer,int Size,int Count,FILE *fp);

2,从文件中读取二进制数据;

·fread(const*Buffer,int Size,int Count,FILE *fp );

参数说明:
    ·Buffer:是一个指针;
       1, 对fread来说,是读入数据的存放地址;
       2, 对fwrite来说,是要输出的数据地址;
    ·Size:是要读写的字节数;
    ·Count:要进行读写多少个Size字节的数据项;
    `fp:文件指针;
17,文件的随机读写

1,顺序读写:位置按字节位置顺序移动;

2,随机读写:读完上一个字符(字节)后,并不一样要读写其后续的字符,而可以读写文件中任意位置上所需的字符;

3,C语言提供以下有关函数,使位置指针指向指定的位置;

·rewind(fp)函数:是使位置指针所返回文件的开头,此函数没有返回值;

·int fseek(FILE* fp,long Offset,int Origi);

参数说明:
    ·fp: 文件指针;
    ·offset: 以起始点为基点,向前移动的字节数;
    ·origi:  文件开头(SEEK_SET 0) 文件当前位置(SEEK_CUR 1) 文件末尾(SEEK_END 2)

`ftell(FILE* fp) :得到当前位置指针的位置,用相对于文件开头的位移量来表示;

//成功则返回当前位置,失败返回EOF(-1);

具体说明:

rewind(fp);//把位置指针移动到开头,从头开始读;
fseek(fp,0,SEEK_SET);//和rewind等价
fseek(fp,1,SEEK_SET);//从当前位置后移1位;
fseek(fp,-4,SEEK_SET);//位尾往前移动5位;
18,文件的重定向
1,在文件夹上方,输入cmd进入命令行窗口
2,用(>复制  >>追加)将指定内容复制到文档下
例子:输入igconfig > 666.txt //将IP地址内容,复制到666.txt中,没有文档会自动创建
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值