5.1 用setvbuf实现setbuf
#include "stdio.h"
#include "apue.h"
void my_setbuf(FILE *restrict fp,char *restrict buf){
if(buf == NULL){
if(setvbuf(fp,buf,_IONBF,BUFSIZ) != 0){
err_quit("setvbuf error!");
}
printf("no buf\n");
}else{
if(fp == stderr){
if(setvbuf(fp,buf,_IONBF,BUFSIZ) != 0){
err_quit("setvbuf error");
}
printf("no buf\n");
}else if(fp == stdin || fp == stdout){
if(setvbuf(fp,buf,_IOLBF,BUFSIZ) != 0){
err_quit("setvbuf error");
}
printf("line buf\n");
}else{
if(setvbuf(fp,buf,_IOFBF,BUFSIZ) != 0){
err_quit("setvbuf error");
}
printf("fully buf\n");
}
}
exit(0);
}
5.2 5.8 节中的程序利用fgets和fputs函数复制文件,每次I/O操作只复制一行,若将程序中的MAXLINE改为4,当复制的行超过该最大值时会发生什么情况?对此进行解释。
和原来的结果相同,fgets给定参数n,fgets只能读取n-1个字符(包括换行符),如果有一行超过n-1个字符,那么fgets返回一个不完整的行,也就是说,只读取该行的前n-1个字符,但是,缓冲区总是以null字符结尾,对fgets的下一次调用会继续读该行。
5.3 printf()返回0值意味着什么?
printf()函数的返回值,如果成功,则返回写入的字符总数,否则返回一个负数。也就是写入的字符数为0。
5.4 下面的代码在一些机器上运行正确,而在另外一些机器运行时错误。解释问题所在。
#include <stdlib.h>
int main(void){
while((c = getchar()) != EOF)
putchar(c);
}
因为getchar返回值为整型,而不是字符型。由于EOF经常被定义为-1。那么如果系统使用的是有符号的字符类型,程序可以正常工作,但是如果使用的是无符号字符类型,则程序会进入死循环。
5.5 为什么tempnam限制前缀为5个字符?
5个字符长的前缀、4个字符长的进程唯一标识再加上5个字符长的系统内唯一标识(进程ID)刚好组成14位的UNIX传统文件名长度限制。