随笔 - 34, 文章 - 3, 评论 - 10, 引用 - 0
数据加载中……

linux c标准I/O函数

标准I/O函数(32)

这些函数除mktemp外的头文件都是stdio.h

函数分类
基本操作:
fclose, fopen, freopen
fread, fwrite
读写位置相关函数:
fseek, fsetpos, rewind
fgetpos, ftell
feof
读取和写入:
fgetc, fgets, getc, getchar, gets, ungetc
fputc, fputs, putc, putchar, puts
文件流指针和文件描述词相互转换:
fdopen, fileno
设置缓冲区:
setbuf, setbuffer, setlinebuf, setvbuf
建立临时文件:
mktemp, tmpfile
其他:
fflush
clearerr

clearerr: 清除文件流的错误旗标
头文件: stdio.h
函数定义: void clearerr(FILE *stream);
说明: clearerr()清除参数stream指定的文件流所使用的错误旗标.

fclose: 关闭文件
头文件: stdio.h
函数定义: int fclose(FILE *stream);
说明: fclose()用来关闭先前fopen()打开的文件. 此动作会让缓冲区内的数据写入文件中, 并释放系统所提供的文件资源. 若成功则返回0, 有错误发生时则返回EOF并把错误代码存到errno. EBADF表示参数stream非已打开的文件.

fdopen: 将文件描述词转化为文件指针
头文件: stdio.h
函数定义: FILE *fdopen(int fildes, const char *mode);
说明: fdopen()会将参数fildes的文件描述词, 转换为对应的文件指针后返回. 参数mode字符串则代表这文件指针的流形态, 此形态必须和原先文件描述词读写模式相同. 关于mode字符串格式请参考fopen(). 若成功则返回指向该流的文件指针, 失败则返回NULL, 并把错误代码存到errno.
应用举例:
#include <stdio.h>
int main(void)
{
FILE *fp;
/* 将标准输出设备的文件描述词0, 转为可写入的文件指针 */
fp = fdopen(0, "r+");
if(fp != NULL)
{
   fprintf(fp, "%s\n", "hello");
}
return 0;
}
运行结果:
hello

feof: 检查文件流是否读到了文件尾
头文件: stdio.h
函数定义: int feof(FILE *stream);
说明: feof()用来检测是否读到了文件尾, 参数steam为fopen()所返回的文件指针. 如果已到文件尾则返回非0值, 其他情况返回0.

fflush: 更新缓冲区
头文件: stdio.h
函数定义: int fflush(FILE *stream);
说明: fflush()会强迫将缓冲区内的数据写回参数stream指定的文件中. 如果参数stream为NULL, fflush()会将所有打开的文件数据更新. 成功返回0, 失败返回EOF, 错误代码存于errno中. EBADF参数stream指定的文件未被打开, 或打开状态为只读. 其它错误代码参考write().

fgetc: 由文件中读取一个字符
头文件: stdio.h
函数定义: int fgetc(FILE *stream);
说明: fgetc()用来从参数stream所指的文件中读取一个字符, 读取位置加1. 成功会返回读取到的字符, 若读到文件尾而无数据可读时返回EOF.

fgetpos: 读取文件流的读取位置
头文件: stdio.h
函数定义: int fgetpos(FILE *stream, fpos_t *pos);
说明: fgetpos()和ftell()一样都是用来取得文件流目前的读写位置. 参数stream为已打开的文件指针. 读写位置会利用参数pos指针返回. 成功返回0, 有错误返回-1, 错误代码存于errno中.

fgets: 读取文件中的一个字符串
头文件: stdio.h
函数定义: char *fgets(char *s, int size, FILE *stream);
说明: fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间中, 直到出现换行字符, 读到文件尾或是已读了size-1个字符为止, 最后会加上NULL作为字符串结束. 成功返回s指针, 错误返回NULL.
应用举例:
#include <stdio.h>
int main(void)
{
char s[80];
/* 从标准输入设备读入80个字符内的字符串,
     写入标准输出设备 */
fputs(fgets(s, 80, stdin), stdout);
return 0;
}
运行结果:
This is a test.
This is a test.

flieno: 返回文件流所使用的文件描述词
头文件: stdio.h
函数定义: int fileno(FILE *stream);
说明: fileno()用来取得参数stream指定的文件流所使用的文件描述词. 返回取得的文件描述词.

fopen: 打开文件
头文件: stdio.h
函数定义: FILE *fopen(const char *path, const char *mode);
说明: 参数path字符串包含欲打开的文件路径及文件名, 参数mode字符串则代表着流形态. mode有下列几种形态字符串:
   r 打开只读文件, 该文件必须存在.
   r+ 打开可读写的文件, 该文件必须存在.
   w 打开只写文件, 若文件存在则文件长度清为0, 即该文件内容会消失. 若文件不存在则建立该文件.
   w+ 打开可读写文件, 若文件存在则文件长度清为零, 即该文件内容会消失. 若文件不存在则建立该文件.
   a 以附加的方式打开只写文件. 若文件不存在, 则会建立该文件, 如果文件存在, 写入的数据会被加到文件尾, 即文件原先的内容会被保留.
   a+ 以附加方式打开可读写的文件. 若文件不存在, 则会建立该文件, 如果文件存在, 写入的数据会被加到文件尾后, 即文件原先的内容会被保留.
上述的形态字符串都可以再加一个b字符, 如rb、w+b或ab+等组合, 加入b字符用来告诉函数库打开的文件为二进制文件, 而非纯文字文件. 不过在POSIX系统, 包含Linux都会忽略该字符. 由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权 限, 此文件权限也会参考umask值.
    文件打开成功, 返回指向该流的文件指针. 若果文件打开失败则返回NULL, 并把错误代码存在errno中.
附加说明: 一般而言, 开文件后会作一些文件读取或写入的动作, 若开文件失败, 接下来的读写动作也无法顺利进行, 所以在fopen()后请作错误判断及处理.
#include <stdio.h>
int main(void)
{
/* 以a+形态打开文件testfile */
FILE *fp;
fp = fopen("testfile", "a+");
if(fp == NULL)
{
   return;
}
fclose(fp);
return 0;
}

fputc: 将一指定字符写入文件内
头文件: stdio.h
函数定义: int fputc(int c, FILE *stream);
说明: fputc会将参数c转换为unsigned char后写入参数stream指定的文件中. 若成功返回写入的字符即参数c, 失败返回EOF.

fputs: 将一指定字符串写入文件内
头文件: stdio.h
函数定义: int fputs(const char *s, FILE *stream);
说明: fputs()用来将参数s所指的字符串写入到参数stream所指的文件内. 若成功返回写入字符个数, 失败返回EOF.

fread: 从文件流读取数据
头文件: stdio.h
函数定义: size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
说明: fread()用来从文件流中读取数据.参数stream为已打开的文件指针, 参数ptr指向欲存放读取进来的数据空间, 参数size为每一项数据的大小, 参数nmemb表示要读取的数据项个数. fread()返回实际读取到的数据项个数, 如果比参数nmemb小, 必须用feof()或ferror()来确定发生了什么情况.
fwrite: 将数据写入文件流中
头文件: stdio.h
函数定义: size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
说明: fwrite()用来向文件流中写入数据.参数stream为已打开的文件指针, 参数ptr指向欲存写入的数据空间, 参数size为每一项数据的大小, 参数nmemb表示要读取的数据项个数. fwrite()返回实际写入的数据项个数.
应用举例:
#include <stdio.h>
#include <string.h>
#define nmemb 3
struct test
{
char name[20];
int size;
}wr[nmemb];
struct test re[nmemb];
void set_test(struct test *pts, const char *ptr)
{
strcpy(pts->name, ptr);
pts->size = strlen(ptr);
}
int main(void)
{
FILE *fp;
int i;
set_test(&wr[0], "Linux");
set_test(&wr[1], "FreeBSD");
set_test(&wr[2], "windows");
fp = fopen("/tmp/fwrite", "w");
fwrite(wr, sizeof(struct test), nmemb, fp);
fclose(fp);

fp = fopen("/tmp/fwrite", "r");
fread(re, sizeof(struct test), nmemb, fp);
fclose(fp);
for(i = 0; i < nmemb; i++)
{
   printf("name[%d]=%-20s, size[%d]=%d\n",
          i, re[i].name, i, re[i].size);
}

return 0;
}
运行结果:
name[0]=Linux               , size[0]=5
name[1]=FreeBSD             , size[1]=7
name[2]=windows             , size[2]=7
并生成/tmp/fwrite

freopen: 关闭原文件, 打开新文件
头文件: stdio.h
函数定义: FILE *freopen(cosnt char *path, const char *mode, FILE *stream);
说明: 参数path字符串包含欲打开的文件路径及文件名, 参数mode请参考fopen()说明. 参数stream为已打开的文件指针. freopen()会将原stream所打开的文件流关闭, 然后打开参数path的文件. 文件打开成功, 返回指向该流的文件指针. 若果文件打开失败则返回NULL, 并把错误代码存在errno中.

fseek: 移动文件流的读写位置
头文件: stdio.h
函数定义: int fseek(FILE *stream, long offset, int whence);
说明: fseek()用来移动文件流的读写位置. 参数stream为已打开的文件指针, 参数offset为根据参数whence来移动读写位置的位移数. 参数whence为下列其中一种:
   SEEK_SET 从距文件开头offset位移量为新的读写位置.
   SEEK_CUR 以目前的读写位置往后增加offset个位移量.
   SEEK_END 将读写位置指向文件尾后再增加offset个位移量.
当whence值为SEEK_CUR或SEEK_END时, 参数offset允许负值的出现. 下列是较特别的使用方式:
1)欲将读写位置移动到文件开头时:fseek(FILE *stream, 0, SEEK_SET);
2)欲将读写位置移动到文件尾时:fseek(FILE *stream, 0, SEEK_END);
当调用成功时则返回0, 若有错误则返回-1, errno会存放错误代码.
附加说明: fseek()不像lseek()会返回读写位置, 因此必须使用ftell()来取得目前读写的位置.

fsetpos: 移动文件流的读写位置
头文件: stdio.h
函数定义: int fsetpos(FILE *stream, fpos_t *pos);
说明: fsetpos()和fseek()一样都是用来移动文件流的读写位置. 参数stream为已打开的文件指针, 参数pos为欲移动到的读写位置. 当调用成功时则返回0, 若有错误则返回-1, errno会存放错误代码.

ftell: 取得文件流的读取位置
头文件: stdio.h
函数定义: long ftell(FILE *stream);
说明: ftell()用来取得文件流目前的读写位置. 参数stream为已打开的文件指针. 当调用成功时则返回目前的读写位置, 若有错误则返回-1, errno会存放错误代码. 错误代码EBADF表示参数无效或可移动读写位置的文件流.

getc: 由文件中读取一个字符
头文件: stdio.h
函数定义: int getc(FILE *stream);
说明: getc()用来从参数stream所指的文件中读取一个字符, 读取位置加1. 成功会返回读取到的字符, 若读到文件尾而无数据可读时返回EOF. 虽然getc()和fgetc()作用相同, 但getc()为宏定义, 非真正的函数调用.

getchar: 由标准输入设备读入一个字符
头文件: stdio.h
函数定义: int getchar(void);
说明: getchar()用来从标准输入设备中读取一个字符. 然后将该字符从unsigned char转换成int后返回. 成功会返回读取到的字符, 有错误返回EOF. getchar()为宏定义, 由getc(stdin)宏定义.

gets: 由标准输入设备读入一个字符串
头文件: stdio.h
函数定义: char *gets(char *s);
说明: gets()用来从标准设备读入字符并存到参数s所指的内存空间, 直到出现换行字符或读到文件尾为止, 最后加上NULL作为字符串结束. 若成功则返回s指针, 返回NULL则表示有错误发生.
附加说明: 由于gets()无法知道字符串s的大小, 必须遇到换行字符或文件尾才会结束输入, 因此容易造成缓冲溢出的安全性问题. 建议使用fgets()取代.

mktemp: 产生唯一的临时文件名
头文件: stdlib.h
函数定义: char *mktemp(char *template);
说明: mktemp()用来产生唯一的临时文件名. 参数template所指的文件名称字符串中最后六个字符必须是XXXXXX. 产生后的文件名会存放在字符串指针参数template中. 若调用成功指向该流的文件名指针就会被返回. 失败则返回NULL, 并把错误代码存在errno中.
附加说明: 参数template所指的文件名称字符串必须声明为数组, 如char template[]="template-XXXXXX", 不可用char *template="template-XXXXXX".
应用举例:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char template[] = "template-XXXXXX";
mktemp(template);
printf("template = %s\n", template);
return 0;
}
运行结果: (运行3遍, 产生不同的文件)
template = template-0wYE7f
template = template-oSxKKH
template = template-EP2DFw

putc: 将一个指定字符写入文件中
头文件: stdio.h
函数定义: int putc(int c, FILE *stream);
说明: putc()会将参数c转为unsigned char后写入参数stream指定的文件中. putc()会返回写入成功的字符, 即参数c. 若返回EOF则代表写入失败. 虽然putc()与fputc()作用相同, 但putc()为宏定义, 非真正的函数调用.

putchar: 将指定的字符写到标准输出设备
头文件: stdio.h
函数定义: int putchar(int c);
说明: putchar()用来将参数c字符写到标准输出设备. putchar()会返回输出成功的字符, 即参数c. 若返回EOF则代表输出失败. putchar()为宏定义, 由putc(c, stdout)宏定义.

puts: 将指定的字符串写到标准输出设备
头文件: stdio.h
函数定义: int puts(const char *s);
说明: puts()用来将参数s字符串写到标准输出设备. puts()若成功返回写出的字符个数, 若返回EOF则代表输出失败.

rewind: 重设文件流的读写位置为文件开头
头文件: stdio.h
函数定义: void rewind(FILE *stream);
说明: rewind()用来把文件流的读写位置移至文件开头. 参数stream为已打开的文件指针. 此函数相当于调用fseek(stream, 0, SEEK_SET).

setbuf: 设置文件流的缓冲区
头文件: stdio.h
函数定义: void setbuf(FILE *stream, char *buf);
说明: 在打开文件流后, 读取内容之前, 调用setbuf()可以用来设置文件流的缓冲区. 参数stream为指定的文件流, 参数buf指向自定的缓冲区起始地址. 如果参数buf为NULL指针, 则为无缓冲IO. setbuf()相当于调用: setvbuf(stream, buf, buf?_IOFBF:_IONBF, BUFSIZ);

setbuffer: 设置文件流的缓冲区
头文件: stdio.h
函数定义: void setbuffer(FILE *stream, char *buf, size_t size);
说明: 在打开文件流后, 读取内容之前, 调用setbuffer()可以用来设置文件流的缓冲区. 参数stream为指定的文件流, 参数buf指向自定的缓冲区起始地址, 参数size为缓冲区大小.

setlinebuf: 设置文件流的缓冲区为线性缓冲区
头文件: stdio.h
函数定义: void setlinebuf(FILE *stream);
说明: setlinebuf()用来设置文件流以换行为依据的无缓冲IO. 相当于调用: setvbuf(stream, (char *)NULL, _IOLBF, 0);

setvbuf: 设置文件流的缓冲区
头文件: stdio.h
函数定义: int setvbuf(FILE *stream, char *buf, int mode, size_t size);
说明: 在打开文件流后, 读取内容之前, 调用setvbuf()可以用来设置文件流的缓冲区. 参数stream为指定的文件流, 参数buf指向自定的缓冲区起始地址, 参数size为缓冲区大小, 参数mode有下列几种:
   _IONBF 无缓冲IO
   _IOLBF 以换行为依据的无缓冲IO
   _IOFBF 完全无缓冲IO. 如果参数buf为NULL指针, 则为无缓冲IO.

tmpfile: 建立临时文件
头文件: stdio.h
函数定义: FILE *tmpfile(void);
说明: tmpfile()用来建立临时文件. 其建立的临时文件的目录由/usr/include/stdio.h中定义的P_tmpdir(/tmp)来决定. 该临时文件建立后会以可读写模式打开, 并将文件指针返回. 若文件打开失败则返回NULL, 并把错误代码存在errno中. 错误代码:
   EACCES 无法建立临时文件.
   EEXIST 临时文件已存在.
   EMFILE 已达到进程可同时打开的文件数上限.
   ENFILE 已达到系统可同时打开的文件数上限.
应用举例:
#include <stdio.h>
int main(void)
{
FILE *fp;
fp = tmpfile();
fclose(fd);
return 0;
}

ungetc: 将一指定字符写回文件流中
头文件: stdio.h
函数定义: int ungetc(int c, FILE *stream);
说明: ungetc()将参数c字符写回参数stream所指定的文件流. 这个写回的字符会由下一个读取文件流的函数取得. 成功返回c字符, 若有错误返回EOF.

posted on 2010-01-21 11:52 wsy6634 阅读(1049) 评论(0)  编辑 收藏 引用


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