不需要更新指针的位置,数据类似数据流入程序;
满缓冲区:只有空或满才读或写;
行缓冲区:以行为单位进行读和写;
无缓冲区:没有缓冲;
刷新输出流的数据到文件中去,不让其缓冲:
流对应的数据类型是File结构体,通过指向结构体的指针来操作流
用file*表示流,这个结构体的指针记录流的位置(开始位置,当前读取的位置,文件末尾位置);
标准流可以直接使用不需要创建 、打开和关闭:
stdin 标准输入流 键盘
stdout 标准输出流 显示器
stderr 标准错误流 显示器
文本文件存字符数据(两个特殊性质):
(1)文本文件有行的概念(二进制文件没有):
不同操作系统表示换行不同,Linux----'\n';Windows---'\r' '\n';
(2)文本文件可能包含一个特殊的文件末尾。EOF(end of file):
Windows -->'\x1a' (ctrl +Z(在流中写入'\x1a' ));转义序列,标识文本文件末尾;
文本文件存储数据,方便人类阅读和编辑(缺点:占用空间高)
二进制文件存储数据:缺点,看不懂(优点占用空间小)
文件路径:
绝对路径:从根目录开始(盘符)一直到文件所在位置:C:\cpp\c\1.C\笔记
相对路径:从当前工作目录开始一直到文件所在位置:cpp\c\1.C\笔记
文件打开方式(模式):
读写文本文件:
fopen:
" R"-------read,只读(要求文件必须事先存在)失败返回空指针;
"W"-------write,只写(文件不需要存在,如果文件存在写之前清空原文件的数据)
"A"-------append,追加(不要求文件存在,如果文件存在,不会清空原文件的内容)
"R+"------读写(要求文件存在,如果写数据会清空数据)
"W+"----读写(不要求文件存在,如果写数据会清空数据)
"A+"-----读写(不要求文件存在,不会清空原有数据)
以上模式默认省略一个字符T;
读写二进制加一个字符B;
fclose:
如果成功关闭返回零;否则返回EOF(-1);
-------------
文本文件:fgetc / fputc(一次读/写一个字符)fgets / fputs(一次读取 / 写入一行)
fscanf / fprintf (从标准输入流中以格式化去读数据,格式化的形式把数据写到标准输出流中 )
从输入流(stream)中读取count-1个字符大小的数据,存入str标识的数组里面,返回一个指向str的指针;
把str字符数组的字符串写出到输出流中去;str是空字符结尾的字符串;
注意,vs中设置命令行参数 文件
从源文件读取内容并写入到目标文件中的简单复制程序(使用fread读写):
fread函数声明:
------------------------------------
从源文件读取内容并写入到目标文件中的简单复制程序
使用fgetc / fputc去读写;
使用fgets / fputs去读写:
------------------------------
序列化:把内存中的对象转化为可以储存或传输的形式的过程;
保存数据要考虑保持的格式:fsacnf / fprintf; 序列化和反序列化样例:
----------------------
代码测试:复制图片:
以二进制的形式进行序列化与反序列化:
----------------
在读和写的过程中我们希望读和写是同时进行的,但是只用“wb”加fwrite读写入(序列化)加上“rb”和fread(反序列化)这样涉及到 操作系统从内核态转化到用户态的变化,导致硬件应用不合理,所以使用“wb+”进行读写,但是因为序列化已经到文件的末尾了,此时的指针指向的是字符流的末尾,反序列化的时候要思考怎么把指针移到字符流的起始位置,这就需要用到文件定位;
int fseek(FILE *stream,long int offset,int whence);
seek_set:文件的起始位置;
seek_cur:文件的当前位置;
seek_end:文件的末尾位置;
移动到文件的开始:
fseek(stream , 0L, seek_set) ==rewind(stream);
往回移动10个字节:
fseek(stream,-10L,SEEK_CUR);
移动到文件的末尾
fseek(stream,0L,SEELK_END);
long ftell(FILE *stream);返回当前文件的位置,相对于SEEK_SET;
void rewind(FILE *stream);
代码:
errno:
数值计算或文件读写发生错误的时候,会把errno设置成对应的值,系统调用的时候(system call,要把cpu转化成内核态),
strerror();
perror: