Linux操作系统-标准IO库(4)

来源:互联网 发布:js点击图片全屏显示 编辑:程序博客网 时间:2024/06/05 10:04

Linux操作系统—标准IO库(4)(2015-8-6)

分类:Linux操作系统

格式化I/O和临时文件

格式化I/O

  格式化I/O的作用是:从输入流读取字符串并以指定的格式转换成内存中的二进制数据,或者将内存中的二进制数据以指定的格式转换成字符串并将转换后的字符串写入输出流。

格式化输出

  可用printf系列函数进行格式化输出处理,它们的原型为:

#include <stdio.h>int printf(const char *format, ...);int fprintf(FILE *stream, const char *format, ...);int sprintf(char *str, const char *format, ...);int snprintf(char *str, size_t size, const char *format, ...);

  各参数含义:
1. stream:流文件指针
2. format:格式输出串
3. ..:输出表项(项数根据format中的转换控制符可变)
4. str:字符串缓冲区
5. size:字符串缓冲区大小
6. 返回值:成功返回格式化后的字符数(不包含’\0’)。若出错返回一个负数

printf:将格式化数据写到标准输出
fprintf:将格式化的数据写至指定的流
sprintf和snprintf:将格式化的字符送入str缓冲区

  snprintf最多将size个字节(含’\0’)写入缓冲区,并且保证最后一个字节是null。snprintf的返回值若大于等于size,则说明格式化的结果在输出时被截断了。例如:

char buf[5];/* 执行以下语句后,n的值为7 */int n = snprintf(buf, 5, "abcdefg");

  相比较sprintf和snprintf,优先使用snprintf,因为sprintf不能指定缓冲区大小,不安全。

格式化输入

  可用scanf系列函数进行格式化输出处理,它们的原型为:

#include <stdio.h>int scanf(const char *format...);int fscanf(FILE *stream, const char *format, ...);int sscanf(const char *str, const char *format, ...);

  函数返回值:若成功,返回实际得到的输入的项数。若出错,则返回EOF
scanf:从标准输入读取格式化数据
fscanf:从指定的流读取数据
sscanf:从str缓冲区读取格式化数据

临时文件

  标准I/O库提供了下列两个函数以帮助创建临时文件,它们的原型如下:

#include <stdio.h>char *tmpnam(char *s);FILE *tmpfile(void);

  函数tmpnam产生一个与现在文件名不同的一个有效路劲名字符串。每次调用它时,它都产生一个不同的路径名,最多的调用次数是TMP_MAX。TMP_MAX在stdio.h中被定义
  如果s为NULL,则所产生的路径名存放在一个静态区中,指向该静态区的指针作为函数值返回,下一次再调用tmpnam时,会重写该静态区
  如果s不为NULL,则认为它指向长度至少是L_tmpnam个字符数组。所产生的路径名存放在该数组中,是也作为函数值返回
  tmpfile创建并打开一个临时的二进制文件流(类型wb+),在关闭该文件流或程序结束时将自动删除这个文件。tmpfile函数的一般实现是先调用tmpnam产生一个唯一的路径名,然后在使用完后用unlink函数删除。
  下面是一个小例子

#include <stdio.h>int main(int argc, char *argv[]){    char name[L_tmpnam], line[BUFSIZ];    FILE *fp;    printf("%s\n", tmpnam(NULL));               /* 创建一个临时文件,并将文件名输出 */    tmpnam(name);                               /* 创建第二个临时文件 */    printf("%s\n", name);                       /* 将产生的文件名输出 */    if ((fp = tmpfile()) == NULL){              /* 创建并打开一个临时文件 */        printf("Fail to create temp file.\n");        return -1;    }    fputs("One line of output.\n", fp);         /* 向临时文件内写入一行文本 */    rewind(fp);    if (fgets(line, sizeof(line), fp) == NULL){        printf("Fail to read file.\n");        fclose(fp);        return -1;    }    fputs(line, stdout);                        /* 从临时文件读出文本 */    return 0;}

  编译并运行

biantiao@lazybone1994-ThinkPad-E430:~/桌面$ gcc -o tmp tmp.c/tmp/ccxjIL5T.o:在函数‘main’中:tmp.c:(.text+0x2e): 警告: the use of `tmpnam' is dangerous, better use `mkstemp'biantiao@lazybone1994-ThinkPad-E430:~/桌面$ ./tmp/tmp/fileUdQWGZ/tmp/filemniLKfOne line of output.biantiao@lazybone1994-ThinkPad-E430:~/桌面$

文件流和文件描述符

  每个文件流都和一个底层文件描述符相关联,可以通过调用fileno函数获得相关联的文件描述符。该函数的原型如下:

#include <stdio.h>int fileno(FILE *stream);

  函数fileno的唯一参数是已打开的文件流指针。函数执行成功时返回一个非负的文件描述符;失败时返回-1,并设置errno指示具体错误。

0 0