UNIX高级环境编程读书笔记(chapter5)

来源:互联网 发布:winrar解压缩软件4.20 编辑:程序博客网 时间:2024/05/19 20:18
5.9 二进制IO
下列两个函数执行二进制IO操作:fread(),fwrite().
(1)读或写一个二进制数组;
(2)读或写一个结构;
返回:读或写的对象数


5.10 定位流
有三种方法定位标准IO流
(1)ftell和fseek函数
(2)ftello和fseeko函数
(3)fgetpos和fsetpos函数


5.11 格式化IO
5.11.1  格式化输出
(1)printf将格式化数据写到标准输出
(2)fprintf写至指定的流
(3)sprintf将格式化的字符送入数组buf中
(4)snprintf

5.11.2格式化输入
(1)scanf
(2)fscanf
(3)sscanf


5.12 实现细节
#include "apue.h"void pri_stdio(const char *, FILE *);int main(void){    FILE *fp;    fputs("Enter any character\n", stdout);    if (getchar() == EOF)    {        err_sys("getchar error");    }    fputs("one line to standard error \n", stderr);    pri_stdio("stdin", stdin);    pri_stdio("stdout", stdout);    pri_stdio("stderr", stderr);    if ((fp = fopen("/etc/motd", "r")) == NULL)    {        err_sys("fopen error");    }    if (getc(fp) == EOF)    {        err_sys("getc error");    }    pri_stdio("/etc/motd", fp);}void pri_stdio(const char *name, FILE *fp){    printf("stream = %s, ", name);    if (fp->_IO_file_flags & _IO_UNBUFFERED)    {        printf("unbuffered");    }    else if (fp->_IO_file_flags & _IO_LINE_BUF)    {        printf("line buffered");    }    else    {        printf("fully buffered");    }    printf(", buffer size = %d\n", fp->_IO_buf_end - fp->_IO_buf_base);}


5.13 临时文件
ISO C 标准提供了两个函数以帮助创建临时文件
(1)tmpnam():产生一个唯一的文件名,当sptr为NULL时,返回一个内部静态内存地址(保存了临时文件名),当下一次以NULL调用函数的时候,该内存会被修改。
(2)tmpfile():以wb+形式创建一个临时二进制文件
#include "apue.h"int main(void){    char name[L_tmpnam], line[MAXLINE];    FILE *fp;    printf("%s\n", tmpnam(NULL));    tmpnam(name);    printf("%s\n", name);    if ((fp = tmpfile()) == NULL)    {        err_sys("tmpfile error");    }    fputs("one line of output\n", fp);    rewind(fp);    if (fgets(line, sizeof(line), fp) == NULL)    {        err_sys("fgets error");    }    fputs(line, stdout);    exit(0);}



注:函数名: rewind()
功 能: 将文件内部的位置指针重新指向一个流(数据流/文件)的开头


5.14 tempfile()函数:是tmpname的一个变体,它允许调用者为所产生的路径名指定目录和前缀.


#include "apue.h"int main(int argc, char *argv[]){    if (argc != 3)    {        err_quit("usage: ./5.4 <directory> <prifix>");    }    printf("%s\n", tempnam(argv[1][0] != ' ' ? argv[1] : NULL , argv[2][0] != ' ' ? argv[2] : NULL));    exit(0);}               


5.15mkstemp()函数:它类似于temfile, 但是该函数返回的不是文件指针,而是临时文件的打开文件描述符.
它返回的文件描述符可用于读写改文件, 与tmpfile不同的是,mkstemp创建的临时文件不会自动被删除,如若想从文件系统名字空间中删除改文件, 则我们
需要自行unlink它。
0 0