c语言文件处理,错误处理,文件流,缓冲,读写,错误处理

1、Unix哲学:一切皆文件

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

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

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:

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

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

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

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

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

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

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

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

fclose:

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

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

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:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值