Linux/Unix C 编程 标准I/O函数(4):流定位,临时文件及其它函数

#include <stdio.h>
#include <wchar.h>

流定位:
long ftell(FILE *fp);
off_t ftello(FILE *fp);
计算一个流的大小,以字节为单。后者是将返回的大小以 off_t 为类型,由实现决定其具体类型。
int fseek(FILE *fp, long offset, int whence);
off_t fseeko(FILE *fp, off_t offset, int whence);
设置流的指针位置。后者以 off_t 为类型,由实现决定其具体类型。

void rewind(FILE *fp);
重置流指针位置到起始位置。

int fgetpos(FILE *fp, fpos_t *pos);
int fsetpos(FILE *fp, const fpos_t *pos);
取流位置或设置流位置,用 fpos_t 结构来保存值。

临时文件:
char *tmpnam(char *ptr);
FILES *tmpfile(void);

标准C的创建临时文件函数。

tmpnam 产生与不重名文件,并立即unlink 该文件,这样可以在程序退出或关闭该文件时被删除。

创建一个临时二进制文件(wb+),关闭或程序退出时删除。(UNIX对二进制文件不做特殊区分)

char *tempnam(const char *dir, const char *prefix);
扩展的创建临时文件函数。

第一参数允许指定路径名和文件名前缀。有4种选择,按以下顺序判断,使用第一个为真的作为目录:环境变量TMPDIR-->dir参数--> stdio.h 中的P_tmpdir-->本地目录(/tmp)。
第二参数如果不为NULL,则用它作为临时文件名的前缀,最大长度为5个字符。
int mkstemp(char *template);
参数为路径名如 /tmp/XXXXXX ,后面的 XXXXXX 为6个X,如果函数成功,template 会被修改XXXXXX成创建的文件名。此函数创建的临时文件不会被自动删除,需要程序 unlink。
tmpnam 和 tempnam 创建文件时有一个时间过程,如果在此过程中其它程序创建了同样的临时文件,则会出现问题。tempfile 和 mkstemp 不会有这样的问题。

其它函数:
int fwide(FILE *fp, int mode);
设置一个流为单字节或多字节。mode 为负:单字节;正:多字节;0:不设置。
)j]&w'YSjw0  新创建的流是没有设置的,如果在没有定向的流使用一个多字节IO函数,则该流为多字节,如果使用一个单字节IO函数,则为单字节。
freopen 函数也清除一个流的设置。

int fflush(FILE *fp);
刷新缓冲区,将所有在缓冲区的数据输出至fp

void setbuf(FILE *fp, char *buf);
设置一个流的打开或关闭缓冲,如果关闭缓冲,则 第二参数为NULL,如果打开缓冲,则应指定一个缓冲区,通常设置缓冲区后,该流为全缓冲,有些系统可能为行缓冲。
int setvbuf(FILE *fp, char *buf, int mode, size_t size);
此函数与上一函数的区别是可以设置精确的缓冲类型(全缓冲:_IOFBF,行缓冲:_IOLBF,不带缓冲:_IONBF)。

int ferror(FILE *fp);
调用此函数判断是否在操作文件时出错了
int feof(FILE *fp);
判断是否到达文件结尾

void clearerr(FILE *fp);
每个流在 FILE 对象中有2个标志:error, eof ,调用此函数清除这2个标志。

int ungetc(char c, FILE *fp);
将读出的字符回送到流中,一次回送一个字符,回送的字符不是写回文件,而是回送到缓冲区中,读出字符的顺序与送回的的顺序相反。
------------------------------------------------------------

// t_ungetc.c //test ungetc

#include <stdio.h>
#include <stdlib.h>

void main(){
FILE *fp;
char szstr[]="ab";
char szget[10];
memset(szget, 0, 10);
fp = fopen("111", "w+");
fputs(szstr, fp);
fflush(fp);
// 第一次读
fseek(fp, 0, SEEK_SET);
fgets(szget, 10, fp);
printf("szget 1 : %s\n", szget);
// 送回第一个字符
ungetc(szget[0], fp);
// 送回第二个字符
ungetc(szget[1], fp);
// 再读出来的字符串顺序应该与前面相反
memset(szget, 0, 10);
fgets(szget, 10, fp);
printf("szget 2 : %s\n", szget);
fclose(fp);
// test mkstemp
mkstemp(szdir);
printf("szdir : %s\n", szdir);
unlink(szdir);
return ;
}
------------------------------------------------------------
[sand@localhost ungetc]$ gcc -o t_ungetc t_ungetc.c
[sand@localhost ungetc]$ ./t_ungetc
szget 1 : ab
szget 2 : ba
szdir : /tmp/Al
[sand@localhost ungetc]$ cat 111

你可能感兴趣的:(编程,C++,c,unix,C#)