• 读书笔记二


    读书笔记二

    ——————————————————————————————————————————————————————————————————————————————————————————————————————

    文件操作都有什么?

    打开方式 含义 指定文件不存在时 指定文件存在时
    r 只读方式打开文本文件 出错 正常打开
    w 只写方式打开文本文件 建立新文件 文件原有内容丢失
    a 追加方式打开文本文件 建立新文件 在原有内容末尾追加
    r+ 读/写方式打开文本文件 出错 正常打开
    w+ 读/写方式创建新的文本文件 建立新文件 文件原有内容丢失
    a+ 读/追加方式建立新的文本文件 建立新文件 在原有内容末尾追加
    rb 只读方式打开二进制文件 出错 正常打开
    wb 只写方式打开二进制文件 建立新文件 文件原有内容丢失
    ab 追加方式打开二进制文件 建立新文件 在原有内容末尾添加
    rb+ 读/写方式打开二进制文件 出错 正常打开
    wb+ 读/写方式创建新的二进制文件 建立新文件 文件原有内容丢失
    ab+ 读/追加方式创建新的二进制文件 建立新文件 在原有内容末尾追加

    二进制文件和文本文件如何转换?

    文本文件与二进制文件:
    简单来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。
    二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思

    • 文本文件转二进制:以文本方式打开读,再以二进制写
    • 二进制文件转文本:以二进制方式读,再以文本方式写

    知识点的归纳及收获

    ——————————————————————————————————————————————————————————————————————————————————————————————————————

    fread()与fwrite()的用法:

    函数原型:size_t fread( void *buffer, size_t size, size_t count, FILE *stream )

    • buffer 是读取的数据存放的内存的指针(可以是数组,也可以是新开辟的空间,buffer就是一个索引)
    • size 是每次读取的字节数
    • count 是读取次数
    • strean 是要读取的文件的指针

    例如 从文件fp里读取100个字节 可用以下语句:

    • fread(buffer,100,1,fp)
    • fread(buffer,50,2,fp)
    • fread(buffer,1,100,fp)

    函数功能

    用来读写一个数据块。

    一般调用形式

    fread(buffer,size,count,fp);

    fwrite(buffer,size,count,fp);

    说明

    (1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。

    (2)size:要读写的字节数;

    (3)count:要进行读写多少个size字节的数据项;

    (4)fp:文件型指针。

    注意:
    1 完成次写操(fwrite())作后必须关闭流(fclose());

    2 完成一次读操作(fread())后,如果没有关闭流(fclose()),则指针(FILE * fp)自动向后移动前一次读写的长度,不关闭流继续下一次读操作则接着上次的输出继续输出;

    fgets()与fputs()的用法:

    • fgets()函数的第二个参数指明了读入字符的最大数量。如果该参数为n,那么fgets函数将读入n-1个字符。如果fgets()函数读到一个换行符,会把它储存在字符串中。这点与gets不同,gets会丢弃换行符。fgets()函数的第三个参数指明要读入的文件。如果读入从键盘输入的数据,则以stdin作为参数。
    • fputs()函数的第二个参数指明他要写入的文件。如果要在计算机显示器上打印,则使用stdout作为参数。与puts()函数不同,fputs()函数不会在待输出字符串末尾添加一个换行符。

    fprint()的用法:

    fscanf和fprintf的函数原型

    int fscanf ( FILE *fp, char * format, ... );
    int fprintf ( FILE *fp, char * format, ... );

    第一个参数:文件指针
    第二个参数:就是格式控制字符串,比如说"%d" 表示十进制输出,"%c"表示单个字符值,%s对应类型为char *, 即字符串(char数组)
    第三个参数:表示参数列表

    注意:fprintf、fscanf的读写对象不是终端而是磁盘文件

    fprintf的用法:

    fprintf可以将键盘上输入的一些信息按照指定的格式录入到由指针fp所指向的文件里面
    首先我们要定义一个文件指针,格式如下

    FILE *fp;
    fp = fopen("xinxi.txt", "w+");

    分析:
    fopen的作用是打开文件,函数原型:FILE * fopen(const char * path,const char * mode);
    注意,后面表示打开方式:

    r 打开只读文件,该文件必须存在。
    r+ 打开可读写的文件,该文件必须存在。
    w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
    w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
    a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
    a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。

    sprintf()的用法:

    sprintf函数的格式:
    int sprintf( char *buffer, const char *format [, argument,...] );

    除了前两个参数固定外,可选参数可以是任意个。buffer是字符数组名;format是格式化字符串

    常用方式

    sprintf函数的功能与printf函数的功能基本一样,只是它把结果输出到指定的字符串中了,看个例子就明白了:
    例:将”test 1 2”写入数组s中
    include<stdio.h>int main(int argc, char *avgv[])
    {
    char s[40]; sprintf(s,"%s%d%c","test",1,'2');
    第一个参数就是指向要写入的那个字符串的指针,剩下的就和printf()一样了
    ————————————————————————————————————————————————————————————————————————————————————————————————————————————-

    相关疑问:

    fscanf怎么读取一行信息及跳过换行符读取

    fscanf用于从由fp所指向的文件中读取信息
    例如:

    int i;
    fscanf(fp, "%d", &i);
    cout<<i;

    其中,fscanf(fp, “%d”, &i);表示从文件中读取一个十进制整数,并把它赋值给i
    想要读取空格或者换行符的话,只需要把%d换成%c即可

    那么如何做到问题所描述的呢?查阅资料得:

    读取一行信息
    用fscanf读取一整行的信息,我们可以这样写

    char str[80];
    fscanf(fp, "[^ ]", str);

    这样一来,str数组就保存了整一行的信息,但是注意,不包括换行符!!
    要是想读取完一整行的信息之后直接跳过换行符到下一行,还可以这样写

    fscanf(fp, "[^ ]%*c", str);
    * 表示输入项读入后跳过,所以 %*c 表示跳过一个字符,在此处即是跳过换行符

    实践代码链接:

    https://gitee.com/zhang_yu_peng/practice-code/blob/master/代码练习.cpp

  • 相关阅读:
    使用Python快速生成虚拟的超大文件
    常用的 adb 命令合集
    Jmeter 性能测试之反向代理录制性能测试脚本
    论医院网络时钟系统(NTP时钟服务器)的重要性
    北斗时钟装置(卫星时间同步系统)应用自动化系统探讨
    解决前端部署到Nginx非根目录下页面出现空白的问题
    解决docker中Easyexcel因缺少字体无法导出的问题
    看图认识HTML5
    看图知Docker
    ASIS CTF Finals 2020
  • 原文地址:https://www.cnblogs.com/1208499954qzone/p/15310978.html
Copyright © 2020-2023  润新知