标准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.
putchar函数应用举例:
#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()用来检测是否读到了文件尾, 参数steamfopen()所返回的文件指针. 如果已到
文件尾则返回非0truecrypt安卓版值, 其他情况返回0.
fflush: 更新缓冲区
头文件: stdio.h
函数定义: int fflush(FILE *stream);
说明: fflush()会强迫将缓冲区内的数据写回参数stream指定的文件中. 如果参数streamNULL, fflush()会将所有打开的文件数据更新. 成功返回0, 失败返回EOF, 错误代码存于errno. EBADF参数stream指定的文件未被打开, 或打开状态为只读. 其它错误代码参考write().
ios开发自学还是培训好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个字符内的字符串, sorts of什么意思
    写入标准输出设备 */
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字符, rbw+bab+等组合linux内核版本最新, 加入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为已打开的文件指针, 参数全国计算机c语言二级真题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_CURSEEK_END, 参数offset允许负值的出现. 下列是较特别的使用方式:
1)欲将读写位置移动到文件开头时:fseek(FILE *stream, 0, SEEK_SET);
2)欲将读写位置移动到文件尾时:fseek(FILE *stream, 0, SEEK_END);
当调用成功时则返回0, 若有错误则返回-1, errno会存放错误代码.
附加说明: fseek()不像lseek()会返回读写位置, 因此必须使用ftell()来取得目前读写的位置.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。