5.1 用setvbuf实现setbuf
C语言setbuf()函数:把缓冲区与流相关联
C语言setvbuf()函数:设置文件流的缓冲区
/*************************************************************************
> File Name: test12_1.c
> Author: King
> Mail: arturiapendragon_1@163.com
> Created Time: 2017年08月21日 星期一 07时32分01秒
************************************************************************/
/*
* 用setvbuf实现setbuf
*/
#include "apue.h"
void
setbuf(FILE *fp, char *restrict_buf)
{
if (restrict_buf == NULL)
{
setvbuf(fp, restrict_buf, _IONBF, 0);
printf("No buf");
}
else
{
if (fp == stdin)
{
if (setvbuf(fp, restrict_buf, _IOLBF, BUFSIZ) != 0)
{
err_sys("setvbuf error");
exit(-1);
}
}
else if(fp == stdout)
{
if (setvbuf(fp, restrict_buf, _IOLBF, BUFSIZ) != 0)
{
err_sys("setvbuf error");
exit(-1);
}
}
else if(fp == stderr)
{
if (setvbuf(fp, restrict_buf, _IOLBF, BUFSIZ) != 0)
{
err_sys("setvbuf error");
exit(-1);
}
}
else
{
if (setvbuf(fp, restrict_buf, _IOFBF, BUFSIZ) != 0)
{
err_sys("setvbuf error");
exit(-1);
}
}
printf("Line buf");
}
}
5.2 图5-5中的程序利用每次一行I/O(fgets和fputs函数)复制文件。若将程序中的MAXLINE改为4,当复制的行超过该最大值时会出现什么情况。对此进行解释。
fgets函数读入数据,直到行结束或缓冲区满(当然会留出一个字节存放终止null字节)。同样fputs只负责将缓冲区的内容输出直到遇到null字节,而并不考虑缓冲区是否包含换行符。所以,如果MAXLINE设得很小,这两个函数仍正常工作,只不过缓冲区较大时,函数被执行的次数要多于MAXLINE值设置得较大的时候。
5.3 printf返回0值表示什么
没有输出字符,即printf("");
5.4 下面的代码在已写机器上运行正确,而在另一些机器运行时出错,解释问题所在。
#include <stdio.h>
int
main(void)
{
char c;
while ((c = getchar()) != EOF)
putchar(c);
}
因为getchar返回的是int型值,而char是无符号数,int转换为无符号数与EOF,值为-1相比较,永远不会相等,该程序形成死循环。
5.5 对标准I/O流如何使用fsync函数?
功能描述:
系统调用fsync将所有已写入文件描述符fd的数据真正的写道磁盘或者其他下层设备上。
使用方法,先调用fflush后调用fsync(保证文件系统与缓冲区内容的一致性)。fsync所使用的参数由fileno函数获得。如果不调用fflush,所有的数据仍然在内存缓冲区中,此时调用fsync将没有任何效果。
5.6 在图1-7和图1-10程序中,打印的提示纤细没有包含换行符,程序也没有调用fflush函数,请解释输出提示信息的原因是什么?
标准输入和标准输出均为行缓冲方式,fgetc每次调用stdin均会冲洗缓冲区。