zoukankan      html  css  js  c++  java
  • 《信息安全系统设计与实现》学习笔记2

    第9章 I/O库函数

    教材学习内容总结

    本章主要学习回顾C语言中文件读写操作和I/O库函数的相关知识。I/O库函数中的算法fread、fwrite、fclose与系统调用中的read、write、close有着联系与交互;I/O库函数有着多种不同模式;文件缓冲流方案。

    一、I/O库函数与系统调用

    I/O库函数的根都在对应的系统调用函数中

    1、系统调用函数

    open():open函数用来打开或创建一个文件,若成功返回文件描述符,否则返回-1。
    read() :read函数逐个字节或者字符读取文件中的内容;
    write() :write函数会把参数buf 所指的内存写入count 个字节到参数fd 所指的文件内。如果顺利write()会返回实际写入的字节数。当有错误发生时则返回-1,错误代码存入erro 中。
    lseek() :每一个已打开的文件都有一个读写位置,当read()或write()时, 读写位置会随之改变,lseek函数是用来控制该文件的读写位置。
    close():close函数用于关闭由open函数所打开的文件。
    

    2、I/O库函数

    fopen()

    fopen函数用于打开文件,第一个形式参数表示文件名,可以包含路径和文件名两部分。其调用格式为:FILE *fopen(char *xxx, *type)。
    

    fread()

    fread函数用于从文件流中读取数据。
    

    fwrite()

    fwrite函数写入文件(可安全用于二进制文件)返回写入的字符数,出现错误时则返回 false。
    

    fseek()

    fseek函数用于重定位流上的文件指针,成功则返回0,否则返回其他值。
    

    fclose()

    fclose()函数用来关闭一个由fopen()函数打开的文件,其调用格式为int fclose(FILE *stream)。该函数返回一个整型数。当文件关闭成功时,返回0,否则返回一个非零值。可以根据函数的返回值判断文件是否关闭成功。
    

    二、I/O库函数算法

    1、fread算法

    第一次调用时,fread()使用保存的文件扫描符fd发出 n=read(fd, fbuffer, BLKSIZE);系统调用,用数据块填充内部的fbuff[];
    初始化fbuff[]指针、计数器和状态变量;
    将数据复制到程序缓冲区;
    若内部缓冲没有足够的数据,则使用read()继续填充内部缓冲区,并将数据从内部缓冲区复制到程序缓冲区;
    复制完之后,更新内部缓冲区的指针、计数器,为下次read()做准备。

    2、fwrite算法

    将数据写入内部缓冲区,调整缓冲区指针、计数器和状态变量;
    若缓冲区满,则调用write()将缓冲区写入系统内核。

    3、fclose算法

    关闭文件流局部缓冲区;
    发出close(fd)系统调用关闭file结构体文件描述符;
    释放file结构体,并将file指针重置为null。

    三、I/O库模式

    “r”:打开一个用于读取的文件。该文件必须存在。
    “w”:创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。
    “a”:追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。
    “r+”:打开一个用于更新的文件,可读取也可写入。该文件必须存在。
    “w+”:创建一个用于读写的空文件。
    “a+”:打开一个用于读取和追加的文件。
    

    1、字符模式I/O

    int fgetc(FILE *fp):
    int ungetc(int c ,FILE *fp);
    int fputc(int c,FILE *fp);
    fgetc()返回的是整数,而不是字符,因为他必须在文件结束时返回文件结束符。文件结束符通常是-1,将他与文件流中的任何字符分开。

    2、行模式I/O

    char *fgets(char *buf,int size,FILE *fp):从fp中读取最多为一行(以 结尾)的字符。
    int fputs(char *buf,FILE *fp):将buf中的一行写入fp中。

    3、格式化I/O

    格式化输入:
    scanf(char *FMT ,&items);
    fscanf(fp,char *FMT ,&items);
    格式化输出:
    printf(char *FMT,items);
    fprintf(fp,char *FMT,items);

    4、内存中的转换函数

    sscanf(buf ,FMT,&items);
    sprintf(buf ,FMT, items);

    四、文件流缓冲

    三种文件缓冲方案

    无缓冲_IONBUF:从非缓冲流中写入(读取)的字符将尽快单独传输到文件(从文件传输)
    行缓冲_IOLBUF:遇到换行符,写入行缓冲流的字符以块的形式传输,如文件流stdout
    全缓冲_IOFBUF:文件流的正常缓冲方案,以块大小传出

    五、实践

    1、编写C程序,将字符写入文本文档

    2、编写C程序,计算文本文件的行数

    3、编写C程序,计算文本文件的单词数

    问题

    1、文件操作都有什么?

    打开文件、读取和追加数据、插入和删除数据、关闭文件、删除文件

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

    编译一个文本文件为二进制数据文件,需按行读取文件,利用strchr 或 strtok函数分割字符串,解析数据,进行转换,把字符对应的AscII码字符(10进制)转换成八位2进制,存储到文件。
    而将二进制数据文件转换为文本文件就是上述过程的逆过程,即将二进制数转化为十进制数。

  • 相关阅读:
    Leetcode Spiral Matrix
    Leetcode Sqrt(x)
    Leetcode Pow(x,n)
    Leetcode Rotate Image
    Leetcode Multiply Strings
    Leetcode Length of Last Word
    Topcoder SRM 626 DIV2 SumOfPower
    Topcoder SRM 626 DIV2 FixedDiceGameDiv2
    Leetcode Largest Rectangle in Histogram
    Leetcode Set Matrix Zeroes
  • 原文地址:https://www.cnblogs.com/daijunxi2019/p/15311200.html
Copyright © 2011-2022 走看看