目录
文件的概念与分类
文件名
文件路径 + 文件主干名 + 文件后缀
通常在说文件时,为方便起见只说文件主干名。
文件指针
缓冲文件系统中,关键的概念是“文件指针”。每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统定义的,取名为FILE。
我们看一下在Dev-C++中该结构体类型是怎样的
在使用FILE时,系统就会自动创建一个这样的结构体变量,当拿这个指针去接收一个文件时,就会根据该文件填充结构体的信息。
文件的打开和关闭
文件打开函数fopen
声名
FILE * fopen (const char* filename , const char* mode)
参数
- filename -- 这是 C 字符串,包含了要打开的文件名称。
- 模式——是C字符串,包含了文件访问方式式。
返回值
文件打开成功,返回 FILE 指针,该指针指向被打开文件对应的文件信息区。若打开失败,返回NULL,且设置全局变量 errno 来标识错误。
当打开文件存在时如下:
现在将该路径下的text.txt文件删掉 ,编译结果如下:
上述程序中采用了绝对路径的方式打开文件,打开的是该路径下的文件。如果这里只写text.txt则只会在该程序文件的路径下找文件。
文件关闭函数fclose
声明
返回值
关闭成功返回 0 ,关闭失败返回EOF。
文件打开方式
上面在介绍打开和关闭文件的函数时用到了文件打开方式 ' r '。
这里讲解一下'w'
'w':为了将数据写入,打开一个文本文件。若该文件存在,会将原先文件中的内容删除掉;若该文件不存在,就会创建一个这样的文件(前提是文件路径正确,不然仍会打开失败)
如下:
该路径下存在文件data.txt
data.txt内容如下:
在vs上用'w'打开该文件
再来看一看文件中内容
所以在使用'w'时一定要注意该不该使用,以免将原先文件中内容删除掉。
文件操作中的输入输出
在理解文件的顺序读写前,先来了解一下流:
流
(该图片取自于博客存储使者,内存驿站-文件操作_diandengren的博客-CSDN博客如有侵权立马删除)
我们在对文件进行读写操作之前需要打开文件,那你有没有想过,在我们想要将某个东西打印在屏幕上或者通过键盘输入某些东西之前,为什么不用打开屏幕或者打开键盘呢?其实设备是默认把他们打开的。
文件的顺序读写
字符输入函数—— fgetc
描述
C 库函数 int fgetc(FILE *stream) 从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。
声明
下面是 fgetc() 函数的声明。
int fgetc(FILE *stream)
参数
- stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要在上面执行操作的流。
返回值
该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。
实例
另外,fgetc适用于所有输入流
字符串输出函数——fputc
声明
下面是 fputc() 函数的声明。
int fputc(int char, FILE *stream)
参数
- char -- 这是要被写入的字符。该字符以其对应的 int 值进行传递。
- stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符的流。
返回值
如果没有发生错误,则返回被写入的字符。如果发生错误,则返回 EOF,并设置错误标识符。
实例
建立一个空文件
运行上面这段程序之后
同样的,fputc也适用于任何输出流
文本行输入函数——fgets
描述
C 库函数 char *fgets(char *str, int n, FILE *stream) 从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。
声明
下面是 fgets() 函数的声明。
char *fgets(char *str, int n, FILE *stream)
参数
- str -- 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
- n -- 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
- stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。
返回值
如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。
如果发生错误,返回一个空指针。
实例
fgets同样适用于所有输入流
文本行输出函数——fputs
描述
把字符串写入到指定的流 stream 中,但不包括空字符。
声明
下面是 fputs() 函数的声明。
int fputs(const char *str, FILE *stream)
参数
- str -- 这是一个数组,包含了要写入的以空字符终止的字符序列。
- stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流。
返回值
该函数返回一个非负值,如果发生错误则返回 EOF。
实例
下面是一个空的文本文档
执行下面代码
我们再来看一下这个文档
同样的fpus也适用于任何输出流
格式化输入函数——fscanf
描述
C 库函数 int fscanf(FILE *stream, const char *format, ...) 从流 stream 读取格式化输入。
声明
下面是 fscanf() 函数的声明。
int fscanf(FILE *stream, const char *format, ...)
参数
- stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
- format -- 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符。
与scanf对比
实例
下面是一个存了三个数据的文本文档,先在让他存到一个结构体中去
代码即运行结果如下:
fscanf也适用于所有输入流,将stream写成stdin,用法就与scanf一样了。
格式化输出函数——fprintf
描述
C 库函数 int fprintf(FILE *stream, const char *format, ...) 发送格式化输出到流 stream 中。
声明
下面是 fprintf() 函数的声明。
int fprintf(FILE *stream, const char *format, ...)
参数
- stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
- format -- 这是 C 字符串,包含了要被写入到流 stream 中的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。
与printf对比
实例
下面是一个空文档
运行下面代码
再来看一下text.txt
与fscanf一样,fprintf将stream写成stdin,用法就与printf一样了。
二进制输入函数——fread
描述
C 库函数 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 从给定流 stream 读取数据到 ptr 所指向的数组中。
声明
下面是 fread() 函数的声明。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
参数
- ptr -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
- size -- 这是要读取的每个元素的大小,以字节为单位。
- nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
- stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。
返回值
成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。
注意
以二进制形式输入输出时,文件中的内容都是以二进制的形式保存的,所以打开文件看到的可能就是一串乱码。
二进制输出函数——fwrite
描述
C 库函数 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) 把 ptr 所指向的数组中的数据写入到给定流 stream 中。
声明
下面是 fwrite() 函数的声明。
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
参数
- ptr -- 这是指向要被写入的元素数组的指针。
- size -- 这是要被写入的每个元素的大小,以字节为单位。
- nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
- stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。
返回值
如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误。
文件的随机读写
fseek函数
描述
C 库函数 int fseek(FILE *stream, long int offset, int whence) 设置流 stream 的文件指针位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。
声明
下面是 fseek() 函数的声明。
int fseek(FILE *stream, long int offset, int whence)
参数
- stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
- offset -- 这是相对 whence 的偏移量,以字节为单位。
- whence -- 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:
常量 | 描述 |
---|---|
SEEK_SET | 文件的开头 |
SEEK_CUR | 文件指针的当前位置 |
SEEK_END | 文件的末尾 |
返回值
如果成功,则该函数返回零,否则返回非零值。
ftell函数
描述
C 库函数 long int ftell(FILE *stream) 返回给定流 stream 的当前文件位置。
声明
下面是 ftell() 函数的声明。
long int ftell(FILE *stream)
参数
- stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
返回值
该函数返回位置标识符的当前值。如果发生错误,则返回 -1L,全局变量 errno 被设置为一个正值。