鱼C论坛

 找回密码
 立即注册
查看: 2089|回复: 0

[学习笔记] 022-文件操作

[复制链接]
发表于 2018-8-24 15:45:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1、从文本流与二进制流到文本文件与二进制文件
流:
在声明一个FILE *fp ,并把fopen(某个文件)返回的值赋予fp这两个动作就相当于建立了一个水龙头,当你用getc(fp)之类的输入函数读取文件字符时就相当于拧开了水龙头,每读取一个字符,这个文件就像水一样的流动一下,fp所指的地址自然就向后移动了一位。
while((getc(fp))!=EOF) putchar(ch);
看这个循环,可以读取一个文件的所有字符。如果不是流的话,ch永远是第一个字符,不会更新。也可以理解为,fp自动++(一个字符的大小)。

         C 语言把这个文件指针称为流,其含义是表达该指针会自动移动来方便读写文件。
        所谓文本流是指在流中流动的数据是以字符形式出现。在文本流中,'/n'被换成回车CR和换行LF的代码0DH和0AH。而当输出时,则0DH和0AH本换成'/n'。
        二进制流是指流动的是二进制数字序列,若流中有字符,则用一个字节的二进制ASCII码表示,若是数字,则用一个字节的二进制数表示。在流入流出时,对/n符号不进行变换。例如2001这个数,在文本流中用其ASCII码表示为:
            '2' '0' '0' '1'
            |  |  |  |
            50  48  48  49
共占4字节。而在二进制流中则表示为:00000111 11010001  用十六进制就是07D1,只占两字节。
        计算机中数据都是以二进制存储的,文本流和二进制流的本质在于程序处理数据的方式不一样,而在选择读写模式后,流会自动帮你处理。
        二进制流处理的文件是二进制文件,文本流处理的文件是文本文件。它们在文件的组织形式上也不一样,二进制文件有文件头(File Header),用以表明文件的大小、类型等信息,程序在处理二进制文件时一般会先分析文件头,判断文件是否合法,也就是说,文件头后面的数据才是程序真正要处理的;字符文件没有文件头,第一个字节就是要显示的内容。
2、文件读写函数
1.按字节读写
         int fgetc(FILE *stream) ;
         int fputc(int char, FILE *stream);
2.按行读写
        char *fgets(char *str, int n, FILE *stream);      // fgets:读取一行(包括'\n'), 并在结尾自动加上'\0',如果正常执行则返回传入的buf指针
        int fputs(const char *str, FILE *stream);
fget()函数采用内存打包技术,把内存首地址str和内存块的大小n一块传给被调函数,这样在被调函数内便可很好的操作主调函数分配的内存空间。
3.按块读写
        size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);  //从给定流 stream 读取数据(size*nmemb个字节)到 ptr 所指向的内存空间;
        size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); // 把 ptr 所指向的内存空间中的(size*nmemb个字节)数据写入到给定流 stream 中.
统一使用:
        size_t fread(void *ptr, n, 1, FILE *stream);  //从给定流 stream 读取数据n个字节到 ptr 所指向的内存空间;
        size_t fwrite(const void *ptr, n, 1, FILE *stream); // 把 ptr 所指向的内存空间中的n个字节数据写入到给定流 stream 中.

3、文件其他操作
1.打开文件
        FILE *fopen(const char *filename, const char *mode);
模式优先选用:"a+", "ab+"; 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的EOF符不保留)。
2.关闭文件
        int fclose(FILE *stream);
关闭流 strea关闭流 stream,刷新所有的缓冲区。
3.文件结束标志
        int feof(FILE *stream);

测试给定流 stream 的文件结束标识符,结束则返回0.
4.重设文件指针
        int fseek(FILE *stream, long int offset, int whence);

设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。
whence参数可选: SEEK_SET-->文件的开头;    SEEK_CUR-->文件指针的当前位置 ;  SEEK_END-->文件的末尾
5.重置文件指针
        void rewind(FILE *stream);
设置文件位置为给定流 stream 的文件的开头。
6.获取文件位置
        long int ftell(FILE *stream);
返回给定流 stream 的当前文件位置。
4、格式化输入输出
1.格式化输出到文件。
        int fprintf(FILE *stream, const char *format, ...);

发送格式化输出到流 stream 中。传送门
2.格式化输出字符串
        int sprintf(char *str, const char *format, ...);

发送格式化输出到 str 所指向的字符串。传送门
3.格式化读取文件
        int fscanf(FILE *stream, const char *format, ...);
        从流 stream 读取格式化输入。传送门
4.格式化读取字符串
        int sscanf(const char *str, const char *format, ...);
从字符串读取格式化输入。传送门

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-22 04:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表