C 文件操作(转载)

 
C 库函数 ( 文件相关操作 ) 文件相关操作
文件打开

 [1]fopen

函数功能: 打开文件

相关函数: open fclose

表头文件: #include

定义函数: FILE * fopen(const char * path,const char * mode);

函数说明: 参数 path 为打开文件路径及文件名, mode 字符串则代表着流形态。

 注意: mode 有下列几种形态字符串 :
 r ---- 打开只读文件, 该文件必须存在。
 r+ --- 打开可读写的文件, 该文件必须存在。
 w ---- 打开只写文件, 若文件存在则文件长度清为 0 ,即该文件内容会消失。
 若文件不存在则建立该文件。
 w+ --- 打开可读写文件, 若文件存在则文件长度清为零,即该文件内容会消失。
 若文件不存在则建立该文件。
 a----- 以附加的方式打开只写文件。
 若文件不存在,则会建立该文件,
 若文件存在,写入数据被加到文件尾,文件原先内容保留
 a+---- 以附加方式打开可读写文件。
 若文件不存在,则会建立该文件,
 若文件存在,写入数据被加到文件尾,文件原先内容保留
 上述的形态字符串都可以再加一个 b 字符,如 rb w+b ab +等组合;
 加入 b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。

返回值: 成功返回指向该流文件的指针;
 失败则返回 NULL ,并把错误代码存在 errno 中。

附加说明: 若开文件失败,接下来的读写动作也无法顺利进行,所以在 fopen() 后请作错误判断及处理。

范例 :
 #include
 int main(int argc,char** argv)
 {
 FILE * fp;
 fp=fopen( noexist , a+ );
 if(fp= =NULL)
 return;
 fclose(fp);
 }

 [2]freopen
函数功能: 打开文件

相关函数: fopen fclose

表头文件: #include

定义函数: FILE * freopen(const char * path,const char * mode,FILE * stream);

函数说明: 参数 path 字符串包含欲打开的文件路径及文件名 ;
 参数 mode 请参考 fopen() 说明 ;
 参数 stream 为已打开的文件指针 ;
 freopen() 会将原 stream 所打开的文件流关闭,然后打开参数 path 的文件。

返回值: 成功返回指向该流的文件指针;
 失败则返回 NULL ,并把错误代码存在 errno 中。

范例 :
 #include
 int main(int argc,char** argv)
 {
 FILE * fp;
 fp=fopen( /etc/passwd , r );
 fp=freopen( /etc/group , r ,fp);
 fclose(fp);
 }
  ===================================================================================

文件关闭

 [1]fclose

函数功能: 关闭文件

相关函数: close fflush fopen setbuf

表头文件: #include

定义函数: int fclose(FILE * stream);

函数说明 : fclose() 关闭 fopen() 打开的文件。
 此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。

返回值 : 成功则返回 0 ;错误返回 EOF ;并把错误代码存到 errno
 错误代码 EBADF 表示参数 stream 非已打开的文件。

范例 : 请参考 fopen ()。
  ===================================================================================
文件读取

 [1]fread

函数功能: 从文件流读取数据

相关函数: fopen fwrite fseek fscanf

表头文件: #include

定义函数: size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);

函数说明: fread() 从文件流中读取数据。
 参数 stream 为已打开的文件指针,
 参数 ptr 指向欲存放读取进来的数据空间,读取的字符数以参数 size*nmemb 来决定。

返回值 : 返回实际读取到的 nmemb 数目。
 如果返回值比参数 nmemb 来得小,代表读到了文件尾或有错误发生,这时必须用 feof ferror
 决定发生什么情况。

范例 :
 #include
 #define nmemb 3
 struct test
 {
 char name[20];
 int size;
 }s[nmemb];
 int main(int argc,char** argv)
 {
 FILE * stream;
 int i;
 stream = fopen( /tmp/fwrite , r );
 fread(s,sizeof(struct test),nmemb,stream);
 fclose(stream);
 for(i=0;i<NMEMB;I++)
 printf( name[%d]=%-20s:size[%d]=%d/n ,
 i,s[i].name,i,s[i].size);
 }

 [2]fgetc

函数功能: 由文件中读取一个字符

相关函数: open fread fscanf getc

表头文件: include

定义函数: int fgetc(FILE * stream);

函数说明: fgetc() 从参数 stream 所指的文件中读取一个字符。
 若读到文件尾而无数据时便返回 EOF

返回值: getc() 会返回读取到的字符,若返回 EOF 则表示到了文件尾。

范例:
 #include
 int main(int argc,char**argv)
 {
 FILE * fp;
 int c,i;
 for(i=0li<5;i++)
 {
 c=getchar();
 putchar(c);
 }
 }

 [2]fgets

函数功能: 由文件中读取一字符串

相关函数: open fread fscanf getc

表头文件: include

定义函数: char * fgets(char * s,int size,FILE * stream);

函数说明: fgets() 从参数 stream 所指的文件内读入字符并存到参数 s 所指的内存中,直到出现换行字符、
 读到文件尾或是已读了 size-1 个字符为止,最后会加上 NULL 作为字符串结束。

返回值: gets() 若成功则返回 s 指针,返回 NULL 则表示有错误发生。

范例:

 #include
 int main(int argc,char** argv)
 {
 char s[80];
 fputs(fgets(s,80,stdin),stdout);
 }

 [3]getc

函数功能: 由文件中读取一个字符

相关函数: read fopen fread fgetc

表头文件: #include

定义函数: int getc(FILE * stream);

函数说明: getc() 用来从参数 stream 所指的文件中读取一个字符。
 若读到文件尾而无数据时便返回 EOF
 虽然 getc() fgetc() 作用相同,但 getc() 为宏定义,非真正的函数调用。

返回值: getc() 会返回读取到的字符,若返回 EOF 则表示到了文件尾。

范例: 参考 fgetc()

 [4]getchar

函数功能: 由标准输入设备内读进一字符

相关函数: fopen fread fscanf getc

表头文件: #include

定义函数: int getchar(void);

函数说明: getchar() 从标准输入设备中读取一个字符。

返回值: getchar() 会返回读取到的字符,若返回 EOF 则表示有错误发生。

附加说明: getchar() 非真正函数,而是 getc(stdin) 宏定义。

范例:

 #include
 int main(int argc,char**argv)
 {
 FILE * fp;
 int c,i;
 for(i=0li<5;i++)
 {
 c=getchar();
 putchar(c);
 }
 }

 [5]gets

函数功能: 由标准输入设备内读进一字符串

相关函数: fopen fread fscanf fgets

表头文件: #include

定义函数: char * gets(char *s);

函数说明: gets() 从标准设备读入字符并存到参数 s 所指的内存空间;
 直到出现换行字符或读到文件尾为止,最后加上 NULL 作为字符串结束。

返回值: gets() 若成功则返回 s 指针,返回 NULL 则表示有错误发生。

附加说明: 由于 gets() 无法知道字符串 s 的大小;
 必须遇到换行字符或文件尾才会结束输入,因此容易造成缓冲溢出的安全性问题。
 建议使用 fgets() 取代。

范例: 参考 fgets()
 ===================================================================================

文件写入
  
 [1]fwrite

函数功能: 将数据写至文件流

相关函数: fopen fread fseek fscanf

表头文件: #include

定义函数: size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);

函数说明: fwrite() 将数据写入文件流中;
 参数 stream 为已打开的文件指针;
 参数 ptr 指向欲写入的数据地址;
 总共写入的字符数以参数 size*nmemb 来决定。

返回值: 返回实际写入的 nmemb 数目。

范例:
 #include
 #define set_s (x,y)

 {

 strcoy(s[x].name,y);

 s[x].size=strlen(y);

 }
 #define nmemb 3
 struct test
 {
 char name[20];
 int size;
 }s[nmemb];
 int main(int argc,char** argv)
 {
 FILE * stream;
 set_s(0, Linux! );
 set_s(1, FreeBSD! );
 set_s(2, Windows2000. );
 stream=fopen( /tmp/fwrite , w );
 fwrite(s,sizeof(struct test),nmemb,stream);
 fclose(stream);
 }

 [2]fputc

函数功能: 将一指定字符写入文件流中

相关函数: fopen fwrite fscanf putc

表头文件: #include

定义函数: int fputc(int c,FILE * stream);

函数说明: fputc 会将参数 c 转为 unsigned char 后写入参数 stream 指定的文件中。

返回值: fputc() 会返回写入成功的字符,即参数 c 。若返回 EOF 则代表写入失败。

范例:
 #include
 int main(int argc,char** argv)
 {
 FILE * fp;
 char a[26]= abcdefghijklmnopqrstuvwxyz ;
 int i;
 fp= fopen( noexist , w );
 for(i=0;i<26;i++)
 fputc(a[i],fp);
 fclose(fp);
 }

 [3]fputs

函数功能: 将一指定的字符串写入文件内

相关函数: fopen fwrite fscanf fputc putc

表头文件: #include

定义函数: int fputs(const char * s,FILE * stream);

函数说明: fputs() 将参数 s 所指的字符串写入到参数 stream 所指的文件内。

返回值: 成功则返回写出的字符个数;
 错误返回 EOF

范例: 请参考 fgets ()。


 [4]putc

函数功能: 将一指定字符写入文件中

相关函数: fopen fwrite fscanf fputc

表头文件: #include

定义函数: int putc(int c,FILE * stream);

函数说明: putc() 将参数 c 转为 unsigned char 后写入参数 stream 指定的文件中。
 虽然 putc() fputc() 作用相同,但 putc() 为宏定义,非真正的函数调用。

返回值: putc() 会返回写入成功的字符,即参数 c 。若返回 EOF 则代表写入失败。

范例: 参考 fputc ()。


 [5]putchar

函数功能: 将指定的字符写到标准输出设备

相关函数: fopen fwrite fscanf fputc

表头文件: #include

定义函数: int putchar (int c);

函数说明: putchar() 用来将参数 c 字符写到标准输出设备。

返回值: putchar() 会返回输出成功的字符,即参数 c 。若返回 EOF 则代表输出失败。

附加说明: putchar() 非真正函数,而是 putc(c stdout) 宏定义。

范例: 参考 getchar()
 ===================================================================================

文件指针移动

 [1]fseek
函数功能: 移动文件流的读写位置

相关函数: rewind ftell fgetpos fsetpos lseek

表头文件: #include

定义函数: 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,0SEEK_END);

返回值: 成功返回 0 ,若有错误则返回 -1;
 errno 会存放错误代码。

附加说明: fseek() 不像 lseek() 会返回读写位置,因此必须使用 ftell() 来取得目前读写的位置。

范例 :
 #include
 int main(int argc,char** argv)
 {
 FILE * stream;
 long offset;
 fpos_t pos;
 stream=fopen( /etc/passwd , r );
 fseek(stream,5,SEEK_SET);
 printf( offset=%d/n ,ftell(stream));
 rewind(stream);
 fgetpos(stream,&pos);
 printf( offset=%d/n ,pos);
 pos=10;
 fsetpos(stream,&pos);
 printf( offset = %d/n ,ftell(stream));
 fclose(stream);
 }

 [2]ftell

函数功能: 取得文件流的读取位置

相关函数: fseek rewind fgetpos fsetpos

表头文件: #include

定义函数: long ftell(FILE * stream);

函数说明: ftell() 用来取得文件流目前的读写位置。
 参数 stream 为已打开的文件指针。

返回值: 成功返回目前的读写位置 ;
 失败返回 -1 errno 存放错误代码。

范例: 参考 fseek()


 [3]rewind

函数功能: 重设文件流的读写位置为文件开头

相关函数: fseek ftell fgetpos fsetpos

表头文件: #include

定义函数: void rewind(FILE * stream);

函数说明: rewind() 把文件流的读写位置移至文件开头。
 参数 stream 为已打开的文件指针。
 此函数相当于调用 fseek(stream,0,SEEK_SET)

返回值:

范例: 参考 fseek()


 [4]feof

函数功能: 检查文件流是否读到了文件尾

相关函数: fopen fgetc fgets fread

表头文件: #include

定义函数: int feof(FILE * stream);

函数说明: feof() 侦测是否读取文件尾部;
 参数 stream fopen ()所返回之文件指针。
 如果已到文件尾则返回非零值,其他情况返回 0

返回值: 返回非零值代表已到达文件尾。
 ===================================================================================

文件指针与描述符互换

 [1]fdopen

函数功能: 将文件描述词转为文件指针

相关函数: fopen open fclose

表头文件: #include

定义函数: FILE * fdopen(int fildes,const char * mode);

函数说明: fdopen() 将参数 fildes 的文件描述词,转换为对应的文件指针后返回。
 参数 mode 字符串则代表着文件指针的流形态,此形态必须和原先文件描述词读写模式相同。
 关于 mode 字符串格式请参考 fopen()

返回值: 成功返回指向该流的文件指针。失败返回 NULL ,并把错误代码存在 errno 中。

范例 :

 #include
 int main(int argc,char** argv)
 {
 FILE * fp =fdopen(0, w+ );
 fprintf(fp, %s/n , hello! );
 fclose(fp);
 }

 [2]fileno

函数功能: 返回文件流所使用的文件描述词

相关函数: open fopen

表头文件: #include

定义函数: int fileno(FILE * stream);

函数说明: fileno 取得 stream 指定文件流所使用的文件描述词。

返回值: 返回文件描述词。

范例:
 #include
 int main(int argc,char** argv)
 {
 FILE * fp;
 int fd;
 fp=fopen( /etc/passwd , r );
 fd=fileno(fp);
 printf( fd=%d/n ,fd);
 fclose(fp);
 }
 ===================================================================================

文件缓冲区操作

 [1]fflush

函数功能: 更新缓冲区

相关函数: write fopen fclose setbuf

表头文件: #include

定义函数: int fflush(FILE* stream);

函数说明: fflush() 强迫将缓冲区内的数据写回参数 stream 指定的文件中。
 如果参数 stream NULL fflush() 会将所有打开的文件数据更新。

返回值: 成功返回 0 ,失败返回 EOF ,错误代码存于 errno 中。
 错误代码 EBADF 参数 stream 指定的文件未被打开,或打开状态为只读。
 其它错误代码参考 write ()。


 [2]setbuf

函数功能: 设置文件流的缓冲区

相关函数: setbuffer setlinebuf setvbuf

表头文件: #include

定义函数: void setbuf(FILE * stream,char * buf);

函数说明: 在打开文件流后,读取内容之前,调用 setbuf() 可以用来设置文件流的缓冲区;
 参数 stream 为指定的文件流,参数 buf 指向自定的缓冲区起始地址。
 如果参数 buf NULL 指针,则为无缓冲 IO
 Setbuf() 相当于调用 :setvbuf(stream,buf,buf?_IOFBF:_IONBF,BUFSIZ)

返回值:


 [3]setbuffer

函数功能 设置文件流的缓冲区

相关函数: setlinebuf setbuf setvbuf

表头文件: #include

定义函数: void setbuffer(FILE * stream,char * buf,size_t size);

函数说明: 在打开文件流后,读取内容之前,调用 setbuffer() 可用来设置文件流的缓冲区;
 参数 stream 为指定的文件流,参数 buf 指向自定的缓冲区起始地址,
 参数 size 为缓冲区大小。

返回值:


 [4]setlinebuf

函数功能: 设置文件流为线性缓冲区

相关函数: setbuffer setbuf setvbuf

表头文件: #include

定义函数: void setlinebuf(FILE * stream);

函数说明: setlinebuf() 用来设置文件流以换行为依据的无缓冲 IO
 相当于调用 setvbuf(stream,(char * )NULL,_IOLBF,0); 请参考 setvbuf()

返回 值:


 [4]setvbuf

函数功能: 设置文件流的缓冲区

相关函数: setbuffer setlinebuf setbuf

表头文件: #include

定义函数: 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

返回值:
 ==================================================================================

文件错误相关操作

 [1]clearerr

函数功能: 清除文件流的错误旗标

相关函数: feof

表头文件: #include

定义函数: void clearerr(FILE * stream);

函数说明: 清除参数 stream 指定的文件流所使用的错误旗标。

返回值:
 ===================================================================================

其他
  
 [1]mktemp

函数功能: 产生唯一的临时文件名

相关函数: tmpfile

表头文件: #include

定义函数: char * mktemp(char * template);

函数说明: mktemp() 用来产生唯一的临时文件名。
 参数 template 所指的文件名称字符串中最后六个字符必须是 XXXXXX

返回值: 成功返回文件名称

附加说明: 参数 template 所指的文件名称字符串必须声明为数组,如 :
 char template[ ]= template-XXXXXX ”;
 不可用 char * template= template-XXXXXX ”;

范例:

 #include
 int main(int argc,char**argv)
 {
 char template[ ]= template-XXXXXX ;
 mktemp(template);
 printf( template=%s/n ,template);
 }


 [2]ungetc

函数功能: 将指定字符写回文件流中

相关函数: fputc getchar getc

表头文件: #include

定义函数: int ungetc(int c,FILE * stream);

函数说明: ungetc() 将参数 c 字符写回参数 stream 所指定的文件流。
 这个写回的字符会由下一个读取文件流的函数取得。

返回值: 成功则返回 c 字符,若有错误则返回 EOF
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值