前言:
在了解后面的文件相关操作前,我们需要知道文件的文件名代表了什么?? 流又是一个什么东西????
文件名:
一个文件要有一个唯一的文件标识,以便使用者调用,一个完整的文件名包含了三个部分的信息 文件路径+文件名主干+文件后缀
G:\\桌面\\lianxi c++\\Project_4_24\\Project_4_24\\test.txt 详细图解如下:
而我们在使用时通常将test.txt认为是该文件的文件名。
流:(一个比较抽象的概念)
一:文件的顺序读写
以文本形式读写文件:
(1)fputc();(向文件中写一个字符)
当然传参时形参c的位置也可以直接传单个字符。
使用该函数写一个字符到文件中
我们使用fopen函数打开test.txt文件,以写的模式,并使用fputc函数往该文件内部写入了一个字符 a,在完成该操作后,使用fclose函数关闭该文件。并将文件指针pf置空。
(2)fgetc();(从文件中读取一个字符)
使用该函数从文件中读取一个字符
我们使用fopen函数打开test.txt文件,以读的模式,并使用fgetc函数从该文件内部读取一个字符,函数的返回值放入ch中,将其打印在屏幕上。在完成该操作后,使用fclose函数关闭该文件。并将文件指针pf置空。
当读取文件到末尾时,fgetc函数会返回EOF。我们在读取文件时,可以通过这个特性来判断文件是否被读完。
(3)fputs();(向文件中写入一个字符串)
使用该函数将一个字符串写入到一个指定的文件中
(4) fgets(); (从文件中获取一个字符串,需要自己指定字符个数)
我们直接从刚才写入的文件里读取三个字符存放到一个新的字符数组中,并打印在屏幕上
可以看到,在屏幕上打印出了 ab 两个字符,因为fgets()函数在读取字符串的时候,会留一个字节的空间存放 \0
(5) fprintf ();(格式化输出数据到文件)
我们定义了一个结构体类型变量,使用fprintf函数进行数据的格式化写入。
程序运行完成后,打开test.txt文件查看信息,可以看到确实是将对应的数据进行格式化写入了。
当然我们也可以使用fprintf函数将数据打印到屏幕上,这里我们只需要将第一个新参的位置写入stdout。
stdout 代表了标准输出流,也就对应着屏幕 。(在前言里面有介绍)
(6) fscanf();从文件中格式化读入数据。
我们定义了一个相同类型的结构体 x ,并初始化为0.将刚才写入的信息格式化的读出并打印
在屏幕上。
以二进制方式读写文件:
(1)fwrite();将数据以二进制的方式写入文件流中
我们将同样的数据以二进制的形式写入到文件中,(因为是二进制的方式,所以我们看不懂内容)
(2)fread();以二进制方式从文件读取数据:
该函数的返回值,是从文件中读取到的元素个数。当没有从文件中读取到元素时,会返回0(也就是假),在对文件进行操作时,可以用这个特性判断文件是否被读完。
可以看到,确实从文件中将刚才写入的数据读出来了。
二:文件的随机读写 (可以自定义读写文件)
前面的函数在对文件进行读写时,都是通过文件指针按顺序读写的,那么如果可以修改文件指针的位置,那就可以实现文件的随机读写。
(1)fseek();修改文件指针位置。
我们在test,txt。文件中每次读取单个字符,前三次顺序读入 a b c 。然后我们通过fseek函数修改该文件指针位置,将其移动到文件初始位置的偏移量为0的位置。再次去读取整个文件中的信息,重新读取出了a
(2)ftell(FILE*stream);返回文件指针相对应起始位置的偏移量。
(3)void rewind(FILE* stream);
直接让文件指针返回到文件起始位置,这里就不进行程序演示了,直接传参文件指针就行。