文件

文件的概念和分类

概念

文件用来存放程序、文档、音频、视频数据、图片等数据的。文件就是存放在磁盘上的,一些数据的集合。

在windows下可以通过写字板或记事本打开文本文件对文件进行编辑保存。写字板和记事本是微软程序员写的程序,对文件进行打开、显示、读写、关闭。作为一个程序员,必须掌握编程实现创建、写入、读取文件等操作

对文件的操作是经常要用到的知识,比如:写飞秋软件传送文件等

分类

磁盘文件:(我们通常认识的文件)

指一组相关数据的有序集合,通常存储在外部介质(如磁盘)上,使用时才调入内存。

设备文件:

在操作系统中把每一个与主机相连的输入、输出设备看作是一个文件,把它们的输入、输出等同于对磁盘文件的读和写。

键盘:标准输入文件

屏幕:标准输出文件

其它设备:打印机、触摸屏、摄像头、音箱等

在Linux操作系统中,每一个外部设备都在/dev目录下对应着一个设备文件,咱们在程序中要想操作设备,就必须对与其对应的/dev下的设备文件进行操作。

标准IO库函数对磁盘文件的读取特点

文件缓冲区是库函数申请的一段内存,由库函数对其进行操作,程序员没有必要知道存放在哪里,只需要知道对文件操作的时候的一些缓冲特点即可

vs中对普通文件的读写是全缓冲的

 

磁盘文件的分类

分类

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

1.在windows系统中,文本模式下,文件以"\r\n"代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"\r\n" 。

2.在类Unix/Linux系统中文本模式下,文件以"\n"代表换行。所以Linux系统中在文本模式和二进制模式下并无区别。

PS

文件指针

概念

文件指针不是指向一个文件,文件指针是个指针,是个结构体指针,用文件体指针标识文件

文件指针在程序中用来标识(代表)一个文件的,在打开文件的时候得到文件指钱,文件指针就用来代表咱们打开的文件

对文件进行读、写、关闭等操作的时候,对文件指针进行操作即可,即咱们将文件指针,传给读写、关闭等函数,那些函数就知道要对哪个文件进行操作

定义

头文件<stdio.h>

一般形式 FILE * 指针变量标识符  (FILE要大写)

FILE不是函数,是系统使用typedef定义的一种结构体类型,包含了文件名,文件状态,文件当前的位置等信息

一般情况下,我们操作文件前必须定义一个文件指针标识我们将要操作的文件

实际编程中使用库函数操作文件,无需关心FILE结构体的细节﹐只需要将文件指针传给io库函数,库函数再通过FILE结构体里的信息对文件进行操作

 操作文件步骤

1、对文件进行读写等操作之前要打开文件得到文件指针

2、可以通过文件指针对文件进行读写等操作

3、读写等操作完毕后,要关闭文件,关闭文件后,就不能再通过此文件指针操作文件了

打开文件

FILE *fopen(const char* path,const char* mode);

打开一个存在的文件,并返回其文件指针(文件标识),或创建一个文件,然后打开它,并返回标识

参数一 表示路径,有绝对路径和相对路径之分

绝对路径指从根目录,比如C盘,D盘开始的路径,由于\是特殊字符,所以传绝对路径时需要用\\来表示\

相对路径是指,从当前文件夹下开始的路径,比如 .\\test\\aaa.txt  开头的点表示从此目录开始

参数二 表示文件打开的操作,比如只读,只写,可读可写等

r是只读方式打开文件,文件不存在返回NULL,存在则返回文件指针

w是只写方式打开文件,文件不存在就(如果可以创建)创建并打开,如果存在,清空文件内容,然后进行写的操作 如果文件打不开,比如只读的文件,就返回NULL

a是以追加方式打开文件,若文件不存在,则同w,若存在,则在文件末尾处进行写的操作,如果不加a的话,打开文件的时候读写位置在文件的开始,对文件进行读写的时候都是从文件开始进行

在后边带上+就是可读可写的打开文件,b是以二进制文件打开,t是以文本方式打开

上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库以二进制模式打开文件。如果不加b,表示默认加了t,即rt,wt,其中t表示以文本模式打开文件。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask 值。

有些C编译系统可能不完全提供所有这些功能,有的C版本不用"r+","w+","a+",而用"rw","wr","ar"等,注意所用系统的规定

关闭文件

fclose(文件指针)

只能关一次,关了之后就不能再进行读写等操作了

关闭成功返回0,失败返回非0

读写文件

读一个字符

fgetc(文件指针)

从文件指针标识的文件中读取一个字节,并返回字节值

返回值,以t的方式:读到文件结尾返回EOF(-1)

    以b的方式,读到文件结尾,以feof(文件指针)判断结尾

    feof是C语言标准库函数,其原型在stdio.h中,其功能是检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0(即,文件结束:返回非0值;文件未结束:返回0值)

写一个字符

fputc(int c,文件指针)

将c的值写到文件指针标识的文件中

写成功则返回c的字节值,否则返回EOF(-1)

PS(字符)

打开文件的时候,默认读写位置在文件的开始,如果以a的方式打开读写位置在文件的末尾

向文件中读取字节或写入字节的时候,读写位置会往文件的末尾方向偏移,读写多少个字节,读写位置就往文件的末尾方向偏移多少个字节

读一个字符串

char*fgets(char *s, int size, FILE*stream);

从stream所代表的文件中读取字符,在读取的时候碰到换行符或者是碰到文件的末尾停止读取,或者是读取了size-1个字节停止读取,在读取的内容后面会加一个\0,作为字符串的结尾

成功则返回目的数组的首地址

失败返回NULL

写一个字符串

int fputs(const char*s, FILE*stream);

将s指向的字符串,写到stream所代表的文件中返回值

成功返回写入的字节数,失败返回-1

按块读

fread

size_t fread(void*ptr, size_t size, size_t nmemb, FILE*stream);

fread.函数从stream所标示的文件中读取数据,一块是size个字节,共nmemb块,也就是一共读size乘以nmemb个字节,并存放到ptr指向的内存里

返回值:实际读到的块数

按块写

fwrite

size_t fwrite(void*ptr, size_t size, size_t nmemb, FILE*stream);

fwrite函数将ptr指向的内存里的数据,向 stream所标识的文件中写入数据,一块是size个字节,共nmemb块

返回值:实际写入的块数

PS(块)

fwrite函数是将内存中的数据原样输出到文件中

firead函数是将文件中的数据原样读取到内存里

随机读写

概念

前面介绍的对文件的读写方式都是顺序读写,即读写文件只能从头开始,顺序读写各个数据;但在实际问题中常要求只读写文件中某一指定的部分,例如:读取文件第200--300个字节

为了解决这个问题可以移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称随机读写

前面介绍的对文件的读写方式都是顺序读写,即读写文件只能从头开始,顺序读写各个数据;但在实际问题中常要求只读写文件中某一指定的部分,例如:读取文件第200--300个字节

为了解决这个问题可以移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称读写

实现随机读写的关键是  要按要求移动位置指针,这称为文件的定位

完成文件定位的函数有:rewind、fseek函数

rewind

void rewind(文件指针)

把文件内部的位置指针移到文件的开始

ftell

long ftell(文件指针)

取得文件流目前的读写位置,距离文件开始有多少个字节

返回当前读写位置,距离文件首的字节数,出错时返回-1

fseek

一般用于二进制文件,即打开文件方式要带b

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

移动文件流的读写位置

 

 

即int fseek(文件类型指针,位移量,起始点);

posted @ 2025-07-14 09:23  二风  阅读(9)  评论(0)    收藏  举报