c语言文件处理,错误处理

1、Unix哲学:一切皆文件

2、流:表示任意输入的源,或输出的目的地;(stream)

c语言文件处理,错误处理_第1张图片

不需要更新指针的位置,数据类似数据流入程序;

3、文件缓冲(多级缓冲)

4、缓冲区的分类:

        满缓冲区:只有空或满才读或写;

        行缓冲区:以行为单位进行读和写;

        无缓冲区:没有缓冲;

刷新输出流的数据到文件中去,不让其缓冲:

5、标准流:

        流对应的数据类型是File结构体,通过指向结构体的指针来操作流

用file*表示流,这个结构体的指针记录流的位置(开始位置,当前读取的位置,文件末尾位置);

标准流可以直接使用不需要创建 、打开和关闭:

        stdin        标准输入流         键盘

        stdout       标准输出流        显示器

        stderr        标准错误流        显示器

6、文本文件和二进制文件:

        文本文件存字符数据(两个特殊性质):

        (1)文本文件有行的概念(二进制文件没有):

不同操作系统表示换行不同,Linux----'\n';Windows---'\r' '\n';

           (2)文本文件可能包含一个特殊的文件末尾。EOF(end of file):

Windows   -->'\x1a' (ctrl +Z(在流中写入'\x1a' ));转义序列,标识文本文件末尾;

文本文件存储数据,方便人类阅读和编辑(缺点:占用空间高) 

二进制文件存储数据:缺点,看不懂(优点占用空间小)

7、打开文件(fopen)和文件关闭(fclose)

文件路径:

        绝对路径:从根目录开始(盘符)一直到文件所在位置:C:\cpp\c\1.C\笔记

        相对路径:从当前工作目录开始一直到文件所在位置:cpp\c\1.C\笔记

文件打开方式(模式):

读写文本文件:

fopen:

c语言文件处理,错误处理_第2张图片

        " R"-------read,只读(要求文件必须事先存在)失败返回空指针;

        "W"-------write,只写(文件不需要存在,如果文件存在写之前清空原文件的数据)

        "A"-------append,追加(不要求文件存在,如果文件存在,不会清空原文件的内容)

        "R+"------读写(要求文件存在,如果写数据会清空数据)

        "W+"----读写(不要求文件存在,如果写数据会清空数据)

        "A+"-----读写(不要求文件存在,不会清空原有数据)

c语言文件处理,错误处理_第3张图片

以上模式默认省略一个字符T;

读写二进制加一个字符B;

fclose:

如果成功关闭返回零;否则返回EOF(-1);

c语言文件处理,错误处理_第4张图片

c语言文件处理,错误处理_第5张图片

-------------

1、文件的读和写

        文本文件:fgetc / fputc(一次读/写一个字符)fgets / fputs(一次读取 / 写入一行)

fscanf / fprintf (从标准输入流中以格式化去读数据,格式化的形式把数据写到标准输出流中  )

c语言文件处理,错误处理_第6张图片

从输入流(stream)中读取count-1个字符大小的数据,存入str标识的数组里面,返回一个指向str的指针;

c语言文件处理,错误处理_第7张图片

把str字符数组的字符串写出到输出流中去;str是空字符结尾的字符串;

注意,vs中设置命令行参数 文件

c语言文件处理,错误处理_第8张图片

c语言文件处理,错误处理_第9张图片

从源文件读取内容并写入到目标文件中的简单复制程序(使用fread读写):

c语言文件处理,错误处理_第10张图片

fread函数声明:

c语言文件处理,错误处理_第11张图片注意:命令行参数的文件路径;

------------------------------------

从源文件读取内容并写入到目标文件中的简单复制程序

使用fgetc / fputc去读写;

c语言文件处理,错误处理_第12张图片

使用fgets / fputs去读写:

c语言文件处理,错误处理_第13张图片

------------------------------

序列化:把内存中的对象转化为可以储存或传输的形式的过程;

保存数据要考虑保持的格式:fsacnf  /  fprintf; 序列化和反序列化样例:

c语言文件处理,错误处理_第14张图片

----------------------

二进制对象的读和写:

c语言文件处理,错误处理_第15张图片

c语言文件处理,错误处理_第16张图片

代码测试:复制图片:

c语言文件处理,错误处理_第17张图片

以二进制的形式进行序列化与反序列化:

c语言文件处理,错误处理_第18张图片

----------------

文件定位:

在读和写的过程中我们希望读和写是同时进行的,但是只用“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);

c语言文件处理,错误处理_第19张图片

long ftell(FILE *stream);返回当前文件的位置,相对于SEEK_SET;

c语言文件处理,错误处理_第20张图片

void rewind(FILE *stream);

c语言文件处理,错误处理_第21张图片

代码:

c语言文件处理,错误处理_第22张图片

错误处理:

errno:

c语言文件处理,错误处理_第23张图片

数值计算或文件读写发生错误的时候,会把errno设置成对应的值,系统调用的时候(system call,要把cpu转化成内核态),

c语言文件处理,错误处理_第24张图片

strerror();

c语言文件处理,错误处理_第25张图片

perror:

c语言文件处理,错误处理_第26张图片

你可能感兴趣的:(c语言)