上一页 1 ··· 29 30 31 32 33 34 35 36 37 ··· 59 下一页
摘要: 5.4 下面的代码在一些机器上运行正确,而在另外一些机器运行时出错,解释问题所在?#include int main( void ){ char c; while( ( c = getchar() ) != EOF ) putchar( c );}答:这是一个比较常见的错误。getc以及getchar的返回值是整型,而不是字符型。由于EOF经常定义为-1,那么如果系统使用的是有符号的字符类型,程序还可以正常工作。但如果使用的是无符号字符类型,那么返回的EOF被保存到字符c后将不再是-1,所以,程序会进入死循环。5.6 对标准I/O流如何使用fsync函数?答:... 阅读全文
posted @ 2014-01-06 09:17 ITtecman 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 标准I/O并不完善。标准I/O库的一个不足之处是效率不高,这与它需要复制的数据量有关。当使用每次一行函数fgets和fputs时,通常需要复制两次数据:一次是在内核和标准I/O缓冲之间(当调用read和write时),第二次是在标准I/O缓冲区和用户程序中的行缓冲区之间。替代版本fio:快速I/O库则避免了这一点,其方法是使读一行的函数返回指向该行的指针,而不是将该行复制到另一个缓冲区中。由于执行了这种更改,grep(1)实用程序的速度增加了两倍。替代版本sfio:这一软件包在速度上与fio相近,通常快于标准I/O库。sfio也提供了一些其他标准I/O库所没有的新特征:推广了I/O流,使其不仅 阅读全文
posted @ 2014-01-06 08:43 ITtecman 阅读(521) 评论(0) 推荐(0) 编辑
摘要: ISO C标准I/O库提供了两个函数以帮助创建临时文件。#include char *tmpnam( char *ptr );返回值:指向唯一路径名的指针FILE *tmpfile( void );返回值:若成功则返回文件指针,若出错则返回NULL若ptr是NULL,则所产生的路径名存放在一个静态区中,指向该静态区的指针作为函数值返回。下一次调用tmpnam时,会重写该静态区(这意味着,如果我们调用此函数多次,而且想保存路径名,则我们应该保存该路径名的副本,而不是指针的副本)。如若ptr不是NULL,则认为它指向长度至少是L_tmpnam个字符的数组(常量L_tmpnam定义在头文件中)。所产 阅读全文
posted @ 2014-01-06 08:24 ITtecman 阅读(655) 评论(0) 推荐(0) 编辑
摘要: 在UNIX系统中,标准I/O库最终都要调用文件I/O(read、write等)。每个标准I/O流都有一个与其相关联的文件描述符,可以对一个流调用fileno函数以获得其描述符。注意,fileno不是ISO C标准部分,而是POSIX.1支持的扩展。#include int fileno( FILE *fp );返回值:与该流相关联的文件描述符如果要调用dup或fcntl等函数,则需要此函数。为了了解你所使用的系统中标准I/O库的实现,最好从头文件开始。从中可以看到:FILE对象是如何定义的、每个流标志的定义以及定义为宏的各个标准I/O例程(例如getc)。程序清单5-3中的程序为三个标准流以及 阅读全文
posted @ 2014-01-05 20:31 ITtecman 阅读(588) 评论(0) 推荐(0) 编辑
摘要: 本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/。一、格式化输出执行格式化输出处理的是4个printf函数。#include int printf( const char *restrict format, ... );int fpritnf( FILE *restrict fp, const char *restrict fromat, ... );两个函数的返回值:若成功则返回输出字符数,若输出出错则返回负值int sprintf( char *restrict buf, const char *re 阅读全文
posted @ 2014-01-05 17:58 ITtecman 阅读(546) 评论(0) 推荐(0) 编辑
摘要: 有三种方法定位标准I/O流。(1)ftell和fseek函数。这两个函数自V7以来就存在了,但是它们都假定文件的位置可以存放在一个长整型中。(2)ftello和fseeko函数。Single UNIX Specification引入了这两个函数,可以使文件偏移量不必一定使用长整型。它们使用off_t数据类型代替了长整型。(3)fgetpos和fsetpos函数。这两个函数是由ISO C引入的。它们使用一个抽象数据类型fpos_t记录文件的位置。这种数据类型可以定义为记录一个文件位置所需的长度。需要移植到非UNIX系统上运行的应用程序应当使用fgetpos和fsetpos。#include lo 阅读全文
posted @ 2014-01-05 15:18 ITtecman 阅读(1057) 评论(0) 推荐(0) 编辑
摘要: 如果进行二进制I/O操作,那么我们更愿意一次读或写整个结构。因此,提供了下列两个函数以执行二进制I/O操作。#include size_t fread( void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp );size_t fwrite( const void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp );两个函数的返回值:读或写的对象数这些函数有两种常见的用法:(1)读或写一个二进制数组。例如,为了将一个浮点数组的第2-5个元素写至一个文件上 阅读全文
posted @ 2014-01-05 14:54 ITtecman 阅读(444) 评论(0) 推荐(0) 编辑
摘要: 程序清单5-1 用getc和putc将标准输入复制到标准输出#include "apue.h"intmain( void ){ int c; while(( c = getc( stdin )) != EOF ) if( putc( c, stdout ) == EOF ) err_sys( "output error" ); if( ferror( stdin )) err_sys( "input error" ); exit( 0 );}程序清单5-2 用fgets和fputs将标准输入... 阅读全文
posted @ 2014-01-05 14:23 ITtecman 阅读(397) 评论(0) 推荐(0) 编辑
摘要: 下面两个函数提供每次输入一行的功能。#include char *fgets( char *restrict buf, int n, FILE *restrict fp );char *gets( char *buf );两个函数返回值:若成功则返回buf,若已到达文件结尾或出错则返回NULL这两个函数都指定了缓冲区的地址,读入的行将送入其中。gets从标准输入读,而fgets则从指定的流读。对于fgets,必须指定缓冲区的长度n。此函数一直读到下一个换行符为止,但是不超过n-1个字符,读入的字符(包括换行符)被送入缓冲区。该缓冲区以null字符结尾。如若该行(包括最后一个换行符)的字符数超过 阅读全文
posted @ 2014-01-05 11:24 ITtecman 阅读(241) 评论(0) 推荐(0) 编辑
摘要: 一旦打开了流,则可在三种不同类型的非格式化I/O中进行选择,对其进行读、写操作:(1)每次一个字符的I/O。一次读或写一个字符,如果流是带缓冲的,则标准I/O会处理所有缓冲。(2)每次一行的I/O。如果想要一次读或写一行,则使用fgets和fputs。每行都以一个换行符终止。当调用fgets时,应说明能处理的最大行长。(3)直接I/O。fread和fwrite函数支持这种类型的I/O。每次I/O操作读或写某种数量的对象,而每个对象具有指定的长度。这两个函数常用于从二进制文件中每次读或写一个结构。直接I/O(direct I/O)这个术语来自ISO C标准,有时也被称为二进制I/O、一次一个对象 阅读全文
posted @ 2014-01-05 09:26 ITtecman 阅读(432) 评论(0) 推荐(0) 编辑
上一页 1 ··· 29 30 31 32 33 34 35 36 37 ··· 59 下一页