jixuduxing

linux学习笔记(6)

5.2 流和file对象
流的定向决定了所读、写的字符时单字节或多字节的,当一个流被创建时,并没有定向,若在未定向的流上使用一个多字节i/o函数,则该流的定向设置为宽定向的,若在为定向的流上使用单字节i/o函数,则将该流的定向设置为字节定向的。
有两个函数可以专门改变流的定向:freopen(清除流的定向)和fwide(设置流的定向),需要注意fwide只针对未定向的流,已定向流不可直接更改,必需清除之后方可;

5.3 标准输入、标准输出、标准出错
STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO

5.4 缓冲
全缓冲
行缓冲
不带缓冲

void setbuf(FILE *restrict fp,char * restrict buf);

int setvbuf(FILE *restrict fp,char *restrict buf,int mode,size_t size);
mode参数:_IOFBF 全 _IOLBF 行 _IONBF 不带

int fflush(FILE *fp)
使所有未写的数据都被传送到内核(?啥意思 不太清楚),如果fp是null,则所有的输出流被冲洗;

5.5 打开流

FILE * fopen(const char *restrict pathname,const char *restrict type);

FILE * freopen(const char *restrict pathname,const char *restrict type);

FILE * fdopen(int filedes,const char *type);

1、fopen打开指定的文件;
2、freopen在一个指定的流上打开一个指定的文件,如若该流已经打开,则先关闭该流。若该流已经定向,则清除该定向。
3、fdopen获取一个现有的文件描述符,并使一个标准的io流与该描述符相结合
注:此函数常用于创建管道和网络通信函数返回的描述符。。。。。因为这类函数不能用标准io函数fopen函数打开。

当以读和写打开一个文件时,具有以下限制:
1、如果中间没有fflush、fseek、fsetpos或rewind,则在输出的后面不能直接跟随输入;
2、如果中间没有fseek、fsetpos或rewind,或者一个输入操作没有到达文件尾端,则在输入操作之后不能直接跟随输出;

5.6 读和写流
1、每次一个字符
getc
fgetc
getchar=getc(stdin);

ungetc将字符再压送回流中;
putc(int c,FILE *fp);
fputc(int c,FILE *fp);
putchar(int c);

5.7 每次一行io

char *fgets(char *restrict buf,int n,FILE *restrict fp);
char *gets(char * buf);

5.8 标准io的效率
1、行io操作函数是用memccpy实现的,而memccpy是利用汇编语言而非c语言编写,效率要高很多;
2、消耗时间应该为用户cpu和系统cpu之和,系统cpu的时间基本相同,因为行io、字符io函数对内核提出的读写请求数基本相同,使用标准io例程的一个优点是无需考虑缓冲和最佳io的选择,在使用fgets的时候需要考虑最大行长,但是与选择最佳io长度相比较,要方便的多;

5.09 二进制io
针对数组、结构体的应用
fread
fwrite

5.10 定位流:
ftell
fseek v7的时候已经存在,都假定文件的位置可以存放在一个长整形中
ftello
fseeko single unix specification 引入,可以使文件偏移量不必一定使用长整型,它们使用off_t数据类型代替长整型
rewind 将一个流设置到文件的起始位置;
fgetpos
fsetpos 它们使用一个抽象数据类型fpos_t记录文件的位置,这种数据类型可以定义为记录一个文件位置所需的长度;


5.11 格式化io
输出

printf
fprintf
sprintf
snprintf

输入

scanf
fscanf
sscanf

5.12 临时文件
int fileno(FILE * fp)
对一个流调用fileno以获得其描述符
5.13 临时文件
char * tmpnam(char * ptr)
FILE * tmpfile();
tmpnam产生一个与现有文件名不同的一个有效路径名字符串,并存放在一个静态区中,指向该静态区的指针作为函数值返回,下一次调用tmpnam会重写该静态区(这意味着,如果我们调用此函数多次,而且想保存路径名,则我们应该保存该路径名的副本,而不是指针的副本)

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

tmpfile函数经常使用的标准unix技术是先调用tmpname产生一个唯一的路径名,然后用该路径名创建一个文件,并立即unlink它
注:对一个文件unlink并不会删除其内容,关闭该文件才会。

char *tempnam(const char * directory,const char *prefix);
是tmpnam的变体,允许调用者为所产生的路径名指定目录和前缀;

int mkstemp(char *template)
类似于tmpfile,是其变体,需要注意的是该函数创建的临时文件不会自动被删除,需要自己unlink

另注:使用tmpnam和tempnam的一个不足之处是:在返回唯一路径和应用程序用该路径名创建文件之间有一个时间窗口,在该时间窗口期间,另一个进程可能会创建一个同名文件,tempfile和mkstemp函数不会产生此种问题;

posted on 2010-05-05 09:40 高磊 阅读(262) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2024年3月>
252627282912
3456789
10111213141516
17181920212223
24252627282930
31123456

统计

常用链接

留言簿

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜