第九章
一、I/O库函数与系统调用
系统调用只支持数据块读写,而I/O库函数支持逻辑单元的读/写文件(行、字符、结构化记录)
系统调用函数:open(), read(), write(), lseek(), close()
I/O库函数:fopen(), fread(), fwrite(), fseek(), fclose()
在c语言中有较为明显的不同是:系统调用使用(int)文件描述符,使用数组来承接,I/O库函数使用FILE结构体的指针,无需自己另设完成文件内容的打印等操作,最后只需传递fp指针即可。
第一二行跳过,第三行:系统调用程序使用while循环读取/写入文件内容。在每个迭代中,它发出read()系统调用,将最多4KB的字符读入buf[]。然后,它将个字符从buf[]写道文件描述符l中,这是该进程的标准输出。使用系统调用一次写入一个字节非常低效。相反,I/O库程序仅仅使用fgetc(fp)从文件流中获取字符,通过putchar()输出字符,直至文件结束。
Fd和fp首先用于打开要被复制的文件,gd和gp作为空白文档用来承载复制过来的内容。如果fopen调用失败,则会进入exit()函数中,如果顺利打开,则会用while()和fread来读取目标文件,循环中使用fwrite一一写入内容
为防止剩余字节小于size(当size大于一时)调用这个文件,先将文件中光标挪到目标区域,然后再一一读取。
二、I/O库函数的算法
1.fread()算法
Fd发出read()的系统调用, 会尝试满足来自内部缓冲区的fread,将数据从内部缓冲区复制到程序缓冲区后,会更新内部缓冲区的指针和计数器等。然后返回实际读取数据对象数量
Fread一面接受来自用户程序的调用,一面向操作系统内核发出read()系统调用。所有fread()只在用户模式中执行,只在需要时才会进入操作系统。
2.fwrite()算法
3.fclose()算法
若文件以写的方式打开,则会先关闭文件流的局部缓冲区,然后再用close()系统调用来关闭FILE结构体中的文件描述符。
三、使用I/O库函数或系统调用
对于以BLKSIZE为单位的读/写数据来说,系统调用只需要一个而不是两个复制操作,而库函数需要依赖系统调用将数据从内核复制到内部缓冲区,然后从内部缓冲区将数据复制到程序的缓冲区。
四、I/O库模式
"r+":表示读/写,不会截断文件。
"w+":表示读/写,但是会先截断文件;如果文件不存在,会创建文件。
"a+":表示通过追加进行读/写;如果文件不存在,会创建文件。
字符模式:fgetc()、putc();
行模式:char* fgets(char* buf,int size, FILE *fp)、 int fputs(char *buf,FILE *fp)
格式化:scanf(char *FMT,&items)、 Fscanf(fp,char *FMT, &items)
内存里的转换函数:sscanf(buf, FMT,&items); sprint(buf, FMT,items)
五、限制混合fread-fwrite
fread()fwrite()会发出read()/write()系统调用来填充/清除内部缓冲区。当read()/write()使用文件OFTE 中的读/写指针时,fread()/fwrite()会使用FILE结构体中局部缓冲区的读/写指针。如果没有fseek()来同步这两个指针,其结果就取决于它们在实现中的使用方式。为了避免出现任何不一致,我们将下面一行:
fseek (fp,(long) 20,0 ) ;插入fread()和 fwrite()中间,结果会相同(而且正确)。
六、文件流缓冲
无缓冲:从非缓冲流中写入或读取的字符将尽快单独传输到文件或从文件中传输。例
如,文件流stderr通常无缓冲。到stderr的所有输出都会立即发出。
行缓冲:遇到换行符时,写人行缓冲流的字符以块的形式传输。例如,文件流stdout
通常是行缓冲,逐行输出数据。
全缓冲:写人全缓冲流或从中读取的字符以块大小传输到文件或从文件传输。这是文
件流的正常缓冲方案。
学习中遇到的问题:
1.在学习中遇到了很多关于宏的描述,却总觉得掌握不了重点,后来经过查找以后,找到了以下解释:计算机科学里的宏是一种抽象的,根据一系列预定义的规则替换一定的文本模式。Excel办公软件自动集成了"VBA"高级程序语言,用此语言编制出的程序就叫"宏"。使用"VBA"需要有一定的编程基础,并且还会耗费大量的时间,因此,绝大多数的使用者仅使用了Excel的一般制表功能,很少使用到"VBA" 。并找到了下面链接,从中找到了详细的解释与用法:https://blog.csdn.net/imgosty/article/details/81901183
2.在进行vim操作时,不能准确地使用相关文件编辑命令,后查资料了解到有如下过程:
1、打开文件vi(如/etc里面有一个文件hosts,要打开这个文件执行vi hosts)
2、进入编辑模式i,a(打开hosts后不能进行编辑,输入i之后出现---insert就进入编辑模式可以进行编辑了)
3、退出编辑模式,按下Esc
4、进入命令模式,按下:
5、退出但不保存q!
6、退出保存wq或x
7、保存w
实践环节:完成了课本的练习题
将文件的小写字母转为大写字母
计算文本行数