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进制,存储到文件。
    而将二进制数据文件转换为文本文件就是上述过程的逆过程,即将二进制数转化为十进制数。

  • 相关阅读:
    Servlet和Filter的url匹配
    iterator的用法
    python学习笔记
    python的序列之列表
    java开发实战学习笔记3
    java学习笔记4
    Java Java集合
    Struts2中的几个符号
    DbHelper.cs
    做word,excel时需要引用com
  • 原文地址:https://www.cnblogs.com/daijunxi2019/p/15311200.html
Copyright © 2011-2022 走看看