《信息安全系统设计与实现》第二周学习笔记

第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中读取最多为一行(以\n结尾)的字符。
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进制,存储到文件。
而将二进制数据文件转换为文本文件就是上述过程的逆过程,即将二进制数转化为十进制数。

上一篇:文件操作


下一篇:几个前端Bug的解决方案