/*
读书笔记类型多种多样,有摘抄型的,有感想型的,有批注型的,有摘要型的……
现在正在研读《C和指针》,其中有很多我认为必要的知识点,摘抄并简单整理了一下,记录在这里。
*/
67. ANSI C对I/O操作进行了抽象。就C程序而言,所有的I/O操作只是简单地从程序移进或移出字节,因此,这种字节流被称为流(stream)。程序只需要关心创建正确的输出字节数据以及正确地解释从输入读取的字节数据。
68. 绝大多数流是完全缓冲的(fully buffered),这意味着“读取”和“写入”实际是从一块被称为缓冲区(buffer)的内存区域来回复制数据。从内存中来回复制数据是非常快速的。用于输出流缓冲区只有当它写满时才会被刷新(flush,物理写入)到设备或文件中。
69. 一种常见的调试策略是把一些printf函数的调用散布于程序中,确定错误出现的具体位置。但是这些函数调用的输出结果被写入到缓冲区中,并不是立即显示于屏幕上。如果程序失败,缓冲输出可能不会被实际写入。解决这个问题的方法就是在每个用于调试的printf函数之后,立即调用fflush,如:
printf( “something or other” );
fflush( stdout );
fflush函数原型:
fflush( FILE *stream );
它迫使一个输出流的缓冲区的数据进行物理写入,不管它是不是已经写满。
70. 流分为文本(text)流和二进制(binary)流。
文本流在不同的操作系统中,特性会有区别,主要有一是文本行的最大长度,但至少有254个字符(标准规定);二是文本行结束方式不同,有的系统是一个回车 + 一个换行符,有的是只用一个换行符。
二进制流的字节将完全根据程序编写它们的形式写入到文件或设备中,而且完全根据它们从文件或设备读取的形式读入到程序中。
71. FILE是一种数据结构,用于访问一个流,其声明包含在stdio.h中,不要将它与存储在磁盘上的数据文件相混淆。如果同时激活了几个流,每个流都有一个相应的FILE与它相联。为了在流上执行一些操作,可以调用一些合适的函数,并向它们传递一个与这个流关联的FILE参数。
72. 对于每个ANSI C程序,运行时系统必须提供至少三个流——标准输入(standard input)、标准输出(standard output)和标准错误(standard error)。它们的名字分别是stdin、stdout和stderr,它们都是指向FILE结构的指针。
标准输入是缺省情况下输入的来源,标准输出是缺省情况的输出设置,具体缺省值因编译器而异,通常标准输入为键盘,标准输出为终端或屏幕。标准错误就是错误信息写入的地方。
73. stdio.h中定义了很多I/O常量,常用的有:
1)EOF——提示到达了文件末尾,EOF所选择的实际值比一个字符要多几位,这是为了避免二制值被错误地解释为EOF.
2)FOPEN_MAX——表示一个程序最多能够打开多少文件,该常数包括三个标准流,其值至少是8,具体值由编译器决定。
3)FILENAME_MAX——编译器所支持的最长文件名。
74. 与文件相关的I/O操作一般流程:
1)程序为必须同时处于活动状态的每个文件声明一个指针变量,其类型为FILE *,这个指针指向FILE结构,当它处于活动状态时由流使用。
2)流通过调用fopen函数打开,使用fopen要指定需要访问的文件或设备以及它们的访问方式(如读、写或既读又写)。fopen和操作系统验证文件或设备确实存在并初始化FILE结构。
3)根据需要对该文件进行读取或写入。
4)调用fclose函数关闭流。关闭一个流可以防止与它相关联的文件被再次访问,保证任何存储于缓冲区的数据被正确地写到文件中,并且释放FILE结构使它可以用于另外的文件。
用户377235 2015-10-25 22:35