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