APUE:标准I/O库(二)

标准I/O库

二进制I/O

#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nobj, FILE *fp) ;
size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *fp) ;
两个函数的返回:读或写的对象数

这些函数有两种常见用法:

  1. 读写一个二进制数组至文件中,size为数组元素长度,nobj为元素个数。
  2. 读写一个结构体size为结构体sizeof,nobj为1。

但因为网络编程的发展,不推荐读写结构体,原因是不同计算机系统对类型的格式不同,结构体不稳定。

定位流

#include <stdio.h>
long ftell(FILE *fp) ;
返回:若成功则为当前文件位置指示,若出错则为-1L
int fseek(FILE *fp,long offset,int whence) ;
返回:若成功则为0,若出错则为非0
void rewind(FILE *fp) ;
  • ftell返回文件偏移位置。
  • fseek设置偏移,whence同seek的whence。
  • rewind将一个流设置到文件的起始位置。

下列函数是C标准新引进的,可用于非UNIX系统

#include <stdio.h>
int fgetpos(FILE *fp, fpos_t *pos) ;
int fsetpos(FILE *fp, const fpos_t *pos) ;
两个函数返回:若成功则为 0,若出错则为非0

fgetpos将文件位置指示器的当前值存入由pos指向的对象中。在以后调用fsetpos时,可以使用此值将流重新定位至该位置。

格式化I/O

执行格式化输出处理的是三个printf函数。

#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE *fp, const char *format, ...);
两个函数返回:若成功则为输出字符数,若输出出错则为负值
int sprintf(char *buf, const char *format, ...);
返回:存入数组的字符数
  • printf写到标准输出。
  • fprintf写到指定流。
  • sprintf写到指定数组且结尾添NULL,但返回字符数不包括NULL。

下列三种printf族的变体类似于上面的三种,但是可变参数表( . . . )代换成了arg。

#include <stdarg.h>
#include<stdio.h>
int vprintf(const char *format, va_list arg) ;
int vfprintf(FILE *fp, const char *format, va_list arg) ;
两个函数返回:若成功则为输出字符数,若输出出错则为负值
int vsprintf(char *buf, const char * format, va_list arg) ;
返回:存入数组的字符数

执行格式化输入处理的是三个scanf函数。

#include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *fp, const char *format, ...);
int sscanf(const char *buf, const char *format, ...);
三个函数返回:指定的输入项数,若输入出错,或在任意变换前已至文件尾端则为EOF

使用方式类似printf族。

实现细节

#include <stdio.h>
int fileno(FILE *fp) ;
返回:与该流相关联的文件描述符

该函数可以返回流所关联的文件描述符。如果要调用dup或fcntl等函数,则需要此函数。

临时文件

标准I/O库提供了两个函数以帮助创建临时文件。

#include <stdio.h >
char *tmpnam(char *ptr) ;
返回:指向一唯一路径名的指针
FILE *tmpfile(void);
返回:若成功则为文件指针,若出错则为NULL

tmpnam产生一个与现在文件名不同的一个有效路径名字符串。每次调用它时,它都产生一个不同的路径名。当ptr为NULL,则所产生的路径名存放在一个静态区中,指向该静态区的指针作为函数值返回。不为NULL,所产生的路径名存放在该数组中,ptr也作为函数值返回。

tmpfile创建一个临时二进制文件(类型wb+),在关闭该文件或程序结束时将自动删除这种文件。

# include <stdio.h>
char *tempnam(const char * directory, const char *prefix;
返回:指向一唯一路径名的指针
  • tempnam是tmpnam的一个变体,它允许调用者为所产生的路径名指定目录和前缀。
  • directory为路径,prefix为前缀。

对于目录有四种不同的选择,并且使用第一个为真的作为目录:
(1) 如果定义了环境变量TMPDIR,则用其作为目录。
(2) 如果参数directory非NULL,则用其作为目录。
(3) 将<stdio.h>中的字符串P_tmpdir用作为目录。
(4) 将本地目录,通常是/tmp,用作为目录。

具体细节见APUE 5.13

发布了18 篇原创文章 · 获赞 0 · 访问量 294

猜你喜欢

转载自blog.csdn.net/weixin_42162340/article/details/95308951