1、流的定向(stream's orientation)决定了所读、写的字符是单字节还是多字节的。
2、若在未定向的流上使用一个多字节I/O函数(见<wchar.h>),则将该流的定向设置为宽定向的。反之,字节定向的。
3、只有两个函数可改变流的定向。freopen函数(稍后讨论)清除一个流的定向;fwide函数可用于设置流的定向。fwide并不改变已定向流的方向。
4、标准输入、标准输出和标准错误自动地被进程使用,与文件描述符STDIN_FILENO、STDOUT_FILENO和STERR_FILENO所引用的相同。这3个标准
I/O流通过预定义文件指针stdin、stdout和stderr加以引用。这3个文件指针定义在头文件<stdio.h>中。
5、标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数。
6、标准I/O提供了全缓冲、行缓冲和不带缓冲3种类型的缓冲。根据数据是否在缓冲区来决定是否需要从内核中读数据。
7、在标准I/O库方面,fflush(冲洗)意味着将缓冲区中的内容写到磁盘上(该缓冲区可能只是部分填满的)。在终端驱动程序方面(如tcflush函数),flush(刷清)表示丢弃已存储在缓冲区的数据。
9、ISO C要求下列缓冲特征。
(1) 当且仅当标准输入和标准输出并不指向交互式设备时,它们才是全缓冲的。
(2) 标准错误决不会是全缓冲的。
8、很多系统默认使用下列类型的缓冲。
(1) 标准错误是不带缓冲的。
(2) 若是指向终端设备的流,则是行缓冲的;否则是全缓冲的。
10、可以调用setbuf或setvbuf更改缓冲类型。
(1) _IOFBF 全缓冲
(2) _IOLBF 行缓冲。
(3) _IONBF 不带缓冲。
11、如果一个描述符引用一个文件,则该文件一定已经存在。
12、当用追加写类型打开一个文件后,每次写都将数据写到文件的当前尾端处。如果有多个进程用标准I/O追加写方式打开同一个文件,那么来自每个进程的数据都将正确地写到文件中。
13、除非流引用终端设备,否则按系统默认,流被打开时是全缓冲的。
14、在文件被关闭之前,冲洗缓冲中的输出数据。缓冲区中的任何输入数据被丢弃。(只出不进)
15、getc、fgetc、getchar不管是出错还是到达文件尾端,这3个函数都返回同样的值。为了区分这两种不同的情况,必须调用ferror或feof(条件为真,返回非0;否则,返回0)。
16、在大多数实现中,为每个流在FILE对象中维护了"出错"和"文件结束"两个标志,调用clearerr可以清除这两个标志。
17、从流中读取数据以后,可以调用ungetc将字符再压送回流中。
(1) 压送回到流中的字符以后又可从流中读出,但读出字符的顺序与压送回的顺序相反。
(2) 不能回送EOF。
(3) 一次成功的ungetc调用会清除该流的文件结束标志。
(4) 用ungetc压送回字符时,并没有将它们写到底层文件中或设备上,只是将它们写回标准I/O库的流缓冲区中。
18、gets从标准输入读,fgets从指定的流读。gets是一个不推荐使用的函数。其问题是调用者在使用gets时不能指定缓冲区的长度。这样就可能造成缓冲区溢出(如若该行长于缓冲区长度),写到缓冲区之后的存储空间中,从而产生不可预料r的结果。
19、puts将一个以null字节终止的字符串写到标准输出,终止符不写出。但是,puts随后又将一个换行符写到标准输出。
20、puts并不像它对应的gets那样不安全。但是我们还是应避免使用它,以免需要记住它在最后是否添加了一个换行符。如果总是使用fgets和fputs,那么就会熟知在每行终止处我们必须自己处理换行符。速度的两倍。
21、使用每次一行I/O版本的速度大约是每次一个字符版本速度的两倍。
22、标准I/O库与直接调用read和write函数相比并不慢很多。对于大多数比较复杂的应用程序,最主要的用户cpu时间是由应用本身的各种处理消耗的,而不是标准I/O例程消耗的。
23、getc和putc读取非常麻烦而且耗时。
24、使用fputs和fgets,那么因为fputs在遇到null字节时就停止,而在结构中可能含有null字节,所以不能使用它实现读结构的要求。如果输入数据中包含有null字节或换行符,则fgets也不能正确工作。
25、使用二进制I/O的基本问题是不能跨进程通信,在不同系统之间交换二进制数据的实际解决办法是使用互认得规范格式。
26、每个标准I/O流都有一个与其相关联的文件描述符,可以对一个流调用fileno函数以获得其描述符。
27、标准I/O库实现在不同的系统中可能有所不同。
28、对一个文件解除链接并不删除其内容,关闭该文件时才删除其内容。而关闭文件可以是显式的,也可以在程序终止时自动进行。
29、与tempfile不同,mkstemp创建的临时文件并不会自动删除。如果希望从文件系统命名空间中删除文件,必须自己对它解除链接。
30、使用tmpnam和tempnam至少有一个缺点:在返回唯一的路径名和用该名字创建文件之间存在一个时间窗口,在这个时间窗口中,另一个进程可以用相同的名字创建文件。因此应该使用tmpfile和mkstemp函数,因为它们不存在这个问题。
31、内存流并不适合存储二进制数据(二进制数据在数据尾端之前就可能包含多个null字节)。
32、fmemopen进行分配缓冲区,没有办法找到缓冲区的地址。
33、内存流只访问主存,不访问磁盘上的文件,所以对于把标准I/O流作为参数用于临时文件的函数来说,会有很大的性能提升。
本文深入探讨了标准I/O流的特性,包括流的定向、缓冲类型、错误处理及流操作。涵盖了从流的定向设置到缓冲机制,以及如何正确处理输入输出数据,确保程序的稳定运行。
3595

被折叠的 条评论
为什么被折叠?



