linux c 文件操作汇总

来源:互联网 发布:windows 桌面路径 编辑:程序博客网 时间:2024/06/02 05:07

本文内容为在网上搜集整理而成,若有疏忽错误,敬请指正,感激不尽!

一、 以下是常用文件操作函数:

1).clearerr(清除文件流的错误旗标)
2).fclose(关闭文件)
3).fdopen(将文件描述词转为文件指针)
4).feof(检查文件流是否读到了文件尾)
5).fflush(更新缓冲区)
6).fgetc(由文件中读取一个字符)
7).fgets(由文件中读取一字符串)
8).fileno(返回文件流所使用的文件描述词)
9).fopen(打开文件)
10).fputc(将一指定字符写入文件流中)
11).fputs(将一指定的字符串写入文件内)
12).fread(从文件流读取数据)
13).freopen(打开文件)
14).fseek(移动文件流的读写位置)
15).ftell(取得文件流的读取位置)
16).fwrite(将数据写至文件流)
17).getc(由文件中读取一个字符)
18).getchar(由标准输入设备内读进一字符)
19).gets(由标准输入设备内读进一字符串)
20).mktemp(产生唯一的临时文件名)
21).putc(将一指定字符写入文件中)
22).putchar(将指定的字符写到标准输出设备)
23).rewind(重设文件流的读写位置为文件开头)
24).setbuf(设置文件流的缓冲区)
25).setbuffer(设置文件流的缓冲区)
26).setlinebuf(设置文件流为线性缓冲区)
27).setvbuf(设置文件流的缓冲区)
28).ungetc(将指定字符写回文件流中)
29).fgets(由文件中读取一字符串)
30).gets()若成功则返回s指针,返回NULL则表示有错误发生。
31).函数名: fputs
1).clearerr(清除文件流的错误旗标)
相关函数 feof
表头文件 #include<stdio.h>
定义函数 void clearerr(FILE * stream);
函数说明 clearerr()清除参数stream指定的文件流所使用的错误旗标。
返回值
 
2).fclose(关闭文件)
相关函数 close,fflush,fopen,setbuf
表头文件 #include<stdio.h>
定义函数 int fclose(FILE * stream);
函数说明 fclose()用来关闭先前fopen()打开的文件。此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。
返回值 若关文件动作成功则返回0,有错误发生时则返回EOF并把错误代码存到errno。
错误代码 EBADF表示参数stream非已打开的文件。
范例 请参考fopen()。
 
3).fdopen(将文件描述词转为文件指针)
相关函数 fopen,open,fclose
表头文件 #include<stdio.h>
定义函数 FILE * fdopen(int fildes,const char * mode);
函数说明 fdopen()会将参数fildes 的文件描述词,转换为对应的文件指针后返回。参数mode 字符串则代表着文件指针的流形态,此形态必须和原先文件描述词读写模式相同。关于mode 字符串格式请参考fopen()。
返回值 转换成功时返回指向该流的文件指针。失败则返回NULL,并把错误代码存在errno中。

范例 #include<stdio.h>
main()
{
FILE * fp =fdopen(0,”w+”);
fprintf(fp,”%s\n”,”hello!”);
fclose(fp);
}

执行 hello!

4).feof(检查文件流是否读到了文件尾)
相关函数 fopen,fgetc,fgets,fread
表头文件 #include<stdio.h>
定义函数 int feof(FILE * stream);
函数说明 feof()用来侦测是否读取到了文件尾,尾数stream为fopen()所返回之文件指针。如果已到文件尾则返回非零值,其他情况返回0。
返回值 返回非零值代表已到达文件尾。
 
5).fflush(更新缓冲区)
相关函数 write,fopen,fclose,setbuf
表头文件 #include<stdio.h>
定义函数 int fflush(FILE* stream);
函数说明 fflush()会强迫将缓冲区内的数据写回参数stream指定的文件中。如果参数stream为NULL,fflush()会将所有打开的文件数据更新。
返回值 成功返回0,失败返回EOF,错误代码存于errno中。
错误代码 EBADF 参数stream 指定的文件未被打开,或打开状态为只读。其它错误代码参考write()。
 
6).fgetc(由文件中读取一个字符)
相关函数 open,fread,fscanf,getc
表头文件 include<stdio.h>
定义函数 nt fgetc(FILE * stream);
函数说明 fgetc()从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时便返回EOF。
返回值 getc()会返回读取到的字符,若返回EOF则表示到了文件尾。
范例 #include<stdio.h>
main()
{
FILE *fp;
int c;
fp=fopen(“exist”,”r”);

while((c=fgetc(fp))!=EOF)
printf(“%c”,c);

fclose(fp);
}

7).fgets(由文件中读取一字符串)
相关函数 open,fread,fscanf,getc
表头文件 include<stdio.h>
定义函数 har * fgets(char * s,int size,FILE * stream);
函数说明 fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串结束。
返回值 gets()若成功则返回s指针,返回NULL则表示有错误发生。
范例 #include<stdio.h>
main()
{
char s[80];
fputs(fgets(s,80,stdin),stdout);
}

执行 this is a test /*输入*/
this is a test /*输出*/
 
8).fileno(返回文件流所使用的文件描述词)
相关函数 open,fopen
表头文件 #include<stdio.h>
定义函数 int fileno(FILE * stream);
函数说明 fileno()用来取得参数stream指定的文件流所使用的文件描述词。
返回值 返回文件描述词。

范例 #include<stdio.h>
main()
{
FILE * fp;
int fd;

fp=fopen(“/etc/passwd”,”r”);

fd=fileno(fp);
printf(“fd=%d\n”,fd);

fclose(fp);
}

执行 fd=3
 
9).fopen(打开文件)
相关函数 open,fclose
表头文件 #include<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>
main()
{
FILE * fp;

fp=fopen(“noexist”,”a+”);
if(fp= =NULL) return;

fclose(fp);
}

10).fputc(将一指定字符写入文件流中)
相关函数 fopen,fwrite,fscanf,putc
表头文件 #include<stdio.h>
定义函数 int fputc(int c,FILE * stream);
函数说明 fputc 会将参数c 转为unsigned char 后写入参数stream 指定的文件中。
返回值 fputc()会返回写入成功的字符,即参数c。若返回EOF则代表写入失败。
范例 #include<stdio.h>
main()
{
FILE * fp;
char a[26]=”abcdefghijklmnopqrstuvwxyz”;
int i;

fp= fopen(“noexist”,”w”);

for(i=0;i<26;i++)
fputc(a[i],fp);

fclose(fp);
}

11).fputs(将一指定的字符串写入文件内)
相关函数 fopen,fwrite,fscanf,fputc,putc
表头文件 #include<stdio.h>
定义函数 int fputs(const char * s,FILE * stream);
函数说明 fputs()用来将参数s所指的字符串写入到参数stream所指的文件内。
返回值 若成功则返回写出的字符个数,返回EOF则表示有错误发生。
范例 请参考fgets()。

12).fread(从文件流读取数据)
相关函数 fopen,fwrite,fseek,fscanf
表头文件 #include<stdio.h>
定义函数 size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);
函数说明 fread()用来从文件流中读取数据。参数stream为已打开的文件指针,参数ptr 指向欲存放读取进来的数据空间,读取的字符数以参数size*nmemb来决定。Fread()会返回实际读取到的nmemb数目,如果此值比参数 nmemb 来得小,则代表可能读到了文件尾或有错误发生,这时必须用feof()或ferror()来决定发生什么情况。
返回值 返回实际读取到的nmemb数目。

附加说明
范例 #include<stdio.h>
#define nmemb 3
struct test
{
char name[20];
int size;
}s[nmemb];

main()
{
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);
}

执行 name[0]=Linux! size[0]=6
name[1]=FreeBSD! size[1]=8
name[2]=Windows2000 size[2]=11
 
13).freopen(打开文件)
相关函数 fopen,fclose
表头文件 #include<stdio.h>
定义函数 FILE * freopen(const char * path,const char * mode,FILE * stream);
函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode请参考fopen()说明。参数stream为已打开的文件指针。Freopen()会将原stream所打开的文件流关闭,然后打开参数path的文件。
返回值 文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno 中。

范例 #include<stdio.h>
main()
{
FILE * fp;

fp=fopen(“/etc/passwd”,”r”);
fp=freopen(“/etc/group”,”r”,fp);

fclose(fp);
}

14).fseek(移动文件流的读写位置)
相关函数 rewind,ftell,fgetpos,fsetpos,lseek
表头文件 #include<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,0SEEK_END);
返回值 当调用成功时则返回0,若有错误则返回-1,errno会存放错误代码。
附加说明 fseek()不像lseek()会返回读写位置,因此必须使用ftell()来取得目前读写的位置。

范例 #include<stdio.h>
main()
{
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);
}

执行 offset = 5
offset =0
offset=10
 
15).ftell(取得文件流的读取位置)
相关函数 fseek,rewind,fgetpos,fsetpos
表头文件 #include<stdio.h>
定义函数 long ftell(FILE * stream);
函数说明 ftell()用来取得文件流目前的读写位置。参数stream为已打开的文件指针。
返回值 当调用成功时则返回目前的读写位置,若有错误则返回-1,errno会存放错误代码。
错误代码 EBADF 参数stream无效或可移动读写位置的文件流。

范例 参考fseek()。

16).fwrite(将数据写至文件流)
相关函数 fopen,fread,fseek,fscanf
表头文件 #include<stdio.h>
定义函数 size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);
函数说明 fwrite()用来将数据写入文件流中。参数stream为已打开的文件指针,参数ptr 指向欲写入的数据地址,总共写入的字符数以参数size*nmemb来决定。Fwrite()会返回实际写入的nmemb数目。
返回值 返回实际写入的nmemb数目。

范例 #include<stdio.h>
#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];
main()
{
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);
}

执行 参考fread()。

17).getc(由文件中读取一个字符)
相关函数 read,fopen,fread,fgetc
表头文件 #include<stdio.h>
定义函数 int getc(FILE * stream);
函数说明 getc()用来从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时便返回EOF。虽然getc()与fgetc()作用相同,但getc()为宏定义,非真正的函数调用。
返回值 getc()会返回读取到的字符,若返回EOF则表示到了文件尾。
范例 参考fgetc()。
 
18).getchar(由标准输入设备内读进一字符)
相关函数 fopen,fread,fscanf,getc
表头文件 #include<stdio.h>
定义函数 int getchar(void);
函数说明 getchar()用来从标准输入设备中读取一个字符。然后将该字符从unsigned char转换成int后返回。
返回值 getchar()会返回读取到的字符,若返回EOF则表示有错误发生。
附加说明 getchar()非真正函数,而是getc(stdin)宏定义。

范例 #include<stdio.h>
main()
{
FILE * fp;
int c,i;

for(i=0;i<5;i++)
{
c=getchar();
putchar(c);
}
}

执行 1234 /*输入*/
1234 /*输出*/

19).gets(由标准输入设备内读进一字符串)
相关函数 fopen,fread,fscanf,fgets
表头文件 #include<stdio.h>
定义函数 char * gets(char *s);
函数说明 gets()用来从标准设备读入字符并存到参数s所指的内存空间,直到出现换行字符或读到文件尾为止,最后加上NULL作为字符串结束。
返回值 gets()若成功则返回s指针,返回NULL则表示有错误发生。
附加说明 由于gets()无法知道字符串s的大小,必须遇到换行字符或文件尾才会结束输入,因此容易造成缓冲溢出的安全性问题。建议使用fgets()取代。
范例 参考fgets()
 
20).mktemp(产生唯一的临时文件名)
相关函数 tmpfile
表头文件 #include<stdlib.h>
定义函数 char * mktemp(char * template);
函数说明 mktemp()用来产生唯一的临时文件名。参数template所指的文件名称字符串中最后六个字符必须是XXXXXX。产生后的文件名会借字符串指针返回。
返回值 文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。

附加说明 参数template所指的文件名称字符串必须声明为数组,如:
char template[ ]=”template-XXXXXX”;
不可用char * template=”template-XXXXXX”;

范例 #include<stdlib.h>
main()
{
char template[ ]=”template-XXXXXX”;
mktemp(template);
printf(“template=%s\n”,template);
}

21).putc(将一指定字符写入文件中)
相关函数 fopen,fwrite,fscanf,fputc
表头文件 #include<stdio.h>
定义函数 int putc(int c,FILE * stream);
函数说明 putc()会将参数c转为unsigned char后写入参数stream指定的文件中。虽然putc()与fputc()作用相同,但putc()为宏定义,非真正的函数调用。
返回值 putc()会返回写入成功的字符,即参数c。若返回EOF则代表写入失败。
范例 参考fputc()。
 
22).putchar(将指定的字符写到标准输出设备)
相关函数 fopen,fwrite,fscanf,fputc
表头文件 #include<stdio.h>
定义函数 int putchar (int c);
函数说明 putchar()用来将参数c字符写到标准输出设备。
返回值 putchar()会返回输出成功的字符,即参数c。若返回EOF则代表输出失败。
附加说明 putchar()非真正函数,而是putc(c,stdout)宏定义。
范例 参考getchar()。

23).rewind(重设文件流的读写位置为文件开头)
相关函数 fseek,ftell,fgetpos,fsetpos
表头文件 #include<stdio.h>
定义函数 void rewind(FILE * stream);
函数说明 rewind()用来把文件流的读写位置移至文件开头。参数stream为已打开的文件指针。此函数相当于调用fseek(stream,0,SEEK_SET)。
返回值
范例 参考fseek()

24).setbuf(设置文件流的缓冲区)
相关函数 setbuffer,setlinebuf,setvbuf
表头文件 #include<stdio.h>
定义函数 void setbuf(FILE * stream,char * buf);
函数说明 在打开文件流后,读取内容之前,调用setbuf()可以用来设置文件流的缓冲区。参数stream为指定的文件流,参数buf指向自定的缓冲区起始地址。如果参数buf为NULL指针,则为无缓冲IO。Setbuf()相当于调 用:setvbuf(stream,buf,buf?_IOFBF:_IONBF,BUFSIZ)
返回值
 
25).setbuffer(设置文件流的缓冲区)
相关函数 setlinebuf,setbuf,setvbuf
表头文件 #include<stdio.h>
定义函数 void setbuffer(FILE * stream,char * buf,size_t size);
函数说明 在打开文件流后,读取内容之前,调用setbuffer()可用来设置文件流的缓冲区。参数stream为指定的文件流,参数buf指向自定的缓冲区起始地址,参数size为缓冲区大小。
返回值

26).setlinebuf(设置文件流为线性缓冲区)
相关函数 setbuffer,setbuf,setvbuf
表头文件 #include<stdio.h>
定义函数 void setlinebuf(FILE * stream);
函数说明 setlinebuf()用来设置文件流以换行为依据的无缓冲IO。相当于调用:setvbuf(stream,(char * )NULL,_IOLBF,0);请参考setvbuf()。
返回值

27).setvbuf(设置文件流的缓冲区)
相关函数 setbuffer,setlinebuf,setbuf
表头文件 #include<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。
返回值

28).ungetc(将指定字符写回文件流中)
相关函数 fputc,getchar,getc
表头文件 #include<stdio.h>
定义函数 int ungetc(int c,FILE * stream);
函数说明 ungetc()将参数c字符写回参数stream所指定的文件流。这个写回的字符会由下一个读取文件流的函数取得。
返回值 成功则返回c 字符,若有错误则返回EOF。
http://hi.baidu.com/exzz/blog/item/9881426e874344dc81cb4a86.html

另外 :
te< te<

29).fgets(由文件中读取一字符串)

  相关函数
  open,fread,fscanf,getc
  表头文件
  include<stdio.h>
  定义函数
  har * fgets(char * s,int size,FILE * stream);
  函数说明
  fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串结束。
  返回值

30).gets()若成功则返回s指针,返回NULL则表示有错误发生。

  范例

  #include<stdio.h>

  main()

  {

   char s[80];

   fputs(fgets(s,80,stdin),stdout);

  }

  执行

  this is a test /*输入*/

this is a test /*输出*/

31).函数名: fputs
  功 能: 送一个字符串到一个流中
  用 法: int fputs(char *string, FILE *stream);
  程序例:
  #include <stdio.h>
  int main(void)
  {
   /* write a string to standard output */
   fputs("Hello world\n", stdout);
   return 0;
}
PS: while(gets(name)!=NULL)可检查文件是否结尾,while((ch=getchar())!=EOF)

gets()读取换行符并将其丢弃,fgets()把换行符存字符串里,但每次显示字符串会显示换行符(不足之处)。fgets() 是为文件I/O而设计得,在处理键盘输入时就不如gets()那么方便。它需要第二个参数来说明最大读入字符数,如果这个参数值为n ,fgets()就会读取最多n-1个字符或者读完一个换行符为止,由这二者中最先满足得那个来结束输入。
fgets()还需要第三个参数来说明哪一个文件。从键盘上读数据时,可以使用stdin 作为该参数,这个标识符在stdio.h中定义。

char name[MAX]

char *ptr;

ptr=fgets(name,MAX,stdio);

--------------------------------------------------------------------------------------

puts()用法很简单,只需给出字符串参数的地址。puts()专门打印字符串,遇到‘\0’才结束,故非字符串或无'\0'的最好不要打印,否则无法结束。

fputs() 是puts()的面向文件版本, 区别是fputs()需要第二个参数说明要写的文件。可以使用stdout 作为参数来进行输出显示,在stdio.h中定义。

与puts()不同,fputs()并不为输出自动添加换行符。

注意 :gets()丢掉输入里的换行符,但puts()为输出添加换行符。fgets()存储输入中的换行符,而fputs()也不为输出添加换行符。如把fgets()输入和puts()输出结合使用,每个字符串后会显示两个换行符。

假定写一个循环,读取一行并把它回显在下一行,可以这样:

char line[81];

while(gets(line))

puts(line);

或者也可以这样:
char line[81];
while(fgets(line,81,stdin))
fputs(line,stdout);
在第一个循环中,line数组中的字符串被显示在单独的一行上,这是由于puts()为它添加了一个换行符。第二个循环,line 数组中的字符串同样显示在单独的一行上,这是由于fgets()存储了一个换行符。puts()是为和gets()一起使用而设计的,而fputs()是为和fgets()一起使用而设计的。


二、 文件打开-fopen
函数简介
函数原型:FILE * fopen(const char * path,const char * mode);
返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。
一般而言,打开文件后会做一些文件读取或写入的动作,若打开文件失败,接下来的读写动作也无法顺利进行,所以一般在fopen()后作错误判断及处理。
参数说明:
参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
mode有下列几种形态字符串:
r 以只读方式打开文件,该文件必须存在。
r+ 以可读写方式打开文件,该文件必须存在。
rb+ 读写打开一个二进制文件,允许读写数据,文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
wb 只写打开或新建一个二进制文件;只允许写数据。
wb+ 读写打开或建立一个二进制文件,允许读和写。
ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库以二进制模式打开文件。如果不加b,表示默认加了t,即rt,wt,其中t表示以文本模式打开文件。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask值。
有些C编译系统可能不完全提供所有这些功能,有的C版本不用"r+","w+","a+",而用"rw","wr","ar"等,读者注意所用系统的规定。
二进制和文本模式的区别
1.在windows系统中,文本模式下,文件以"\r\n"代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"\r\n" 。
2.在类Unix/Linux系统中文本模式下,文件以"\n"代表换行。所以Linux系统中在文本模式和二进制模式下并无区别。
打开方式总结:各种打开方式主要有三个方面的区别:
①打开是否为二进制文件,用“b”标识。
②读写的方式,有以下几种:只读、只写、读写、追加只写、追加读写这几种方式。
③对文件是否必 须存在、以及存在时是清空还是追加会有不同的响应。具体判断如下图。
程序示例
示例一
#include<stdio.h>

#define F_PATH "d:\\myfile\\file.dat"
int main(void)
{
FILE*fp=NULL;//需要注意
fp=fopen(F_PATH,"r");
if(NULL==fp)
{
return -1;//要返回错误代码
}
fclose(fp);
fp=NULL;//需要指向空,否则会指向原打开文件地址

return 0;
}
示例二
#include<stdio.h>
#include<stdlib.h>//为了使用exit()
int main()
{
char ch;
FILE *fp=NULL;
char fname[50];//用于存放文件名
printf("输入文件名:");
scanf("%s",fname);
fp=fopen(fname,"r");//只供读取
if(fp==NULL)//如果失败了
{
printf("错误!");
exit(1);//中止程序
}
while((ch=getc(fp))!=EOF)
putchar(ch);
fclose(fp);//关闭文件
fp=NULL;//需要指向空,否则会指向原打开文件地址

return 0;
}
注意!初学者往往会犯一个错误,即在输入文件名时不加后缀名,请注意加上!(为什么文件一定要有后缀名?)
示例三[1]
#include<stdio.h>

FILE*stream,*stream2;

int main(void)
{
int numclosed;
//Open for read(willfailiffile"crt_fopen.c"doesnotexist)
if((stream=fopen("crt_fopen.c","r"))==NULL)//C4996
//Note:fopenisdeprecated;considerusingfopen_sinstead
printf("Thefile'crt_fopen.c'wasnotopened\n");
else
printf("Thefile'crt_fopen.c'wasopened\n");
//Openforwrite
if((stream2=fopen("data2","w+"))==NULL)//C4996
printf("Thefile'data2'wasnotopened\n");
else
printf("Thefile'data2'wasopened\n");
//ClosestreamifitisnotNULL
if(stream)
{
if(fclose(stream))
{
printf("Thefile'crt_fopen.c'wasnotclosed\n");
}
}
//Allotherfilesareclosed:
numclosed=_fcloseall();
printf("Numberoffilesclosedby_fcloseall:%u\n",numclosed);
}

示例四:
Linux下的程序示例。
在/opt/C_lanuage/fopen_fread新建两个文本,main.c tmp.txt
tmp.txt:
I Love You Linux ---- Red Hat Enterprise ---- 梦剧场的记忆

main.c程序:

1 #include<stdio.h>
2
3 int main(void)
4 {
5 FILE *fp = NULL;
6 char tmp[100];
7
8 fp = fopen("/opt/C_lanuage/fopen_fread/tmp.txt","r");
9 if(NULL == fp)
10 {
11 printf("file open Fail!\n");
12 return -1;
13 }
14
15 fread(tmp,1,100,fp);
16
17 printf("%s\n",tmp);
18
19 fclose(fp);
20 fp = NULL;
21
22 return 0;
23 }
编译加执行
[root@localhost fopen_fread]# gcc -g main.c -o main
[root@localhost fopen_fread]# ./main
I Love You Linux ---- Red Hat Enterprise ---- 梦剧场的记忆
[2]
注意
在文件操作时,需要注意以下几点问题
1、在定义文件指针时,要将文件指针指向空;如 FILE *fp = NULL;
2、文件操作完成后,需要将文件关闭,一定要注意,否则会造成文件所占用内存泄露和在下次访问文件时出现问题。
3、文件关闭后,需要将文件指针指向空,这样做会防止出现游离指针,而对整个工程造成不必要的麻烦;如:fp = NULL;


三、 打开文件的方式open和fopen的区别
1).缓冲文件系统
缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。由此可以看出,内存 “缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则操作外存的次数就少,执行速度就快、效率高。一般来说,文件“缓冲区”的大小随机器 而定。
fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等
2).非缓冲文件系统
缓冲文件系统是借助文件结构体指针来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符、字符串、格式化数据,也可以读写二进制数 据。非缓冲文件系统依赖于操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出,它不设文件结构体指针,只能读写二进制文件,但效率高、速度 快,由于ANSI标准不再包括非缓冲文件系统,因此建议大家最好不要选择它。本书只作简单介绍。open, close, read, write, getc, getchar, putc, putchar 等。
open 是系统调用返回的是文件句柄,文件的句柄是文件在文件描述副表里的索引,fopen是C的库函数,返回的是一个指向文件结构的指针。
fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api .linux中的系统函数是open,fopen是其封装函数,个人观点。
文件描述符是linux下的一个概念,linux下的一切设备都是以文件的形式操作.如网络套接字、硬件设备等。当然包括操作文件。
fopen是标准c函数。返回文件流而不是linux下文件句柄。
设备文件不可以当成流式文件来用,只能用open
fopen是用来操纵正规文件的,并且设有缓冲的,跟open还是有一些区别
一般用fopen打开普通文件,用open打开设备文件
fopen是标准c里的,而open是linux的系统调用.
他们的层次不同.
fopen可移植,open不能.
我认为fopen和open最主要的区别是fopen在用户态下就有了缓存,在进行 read和write的时候减少了用户态和内核态的切换,而open则每次都需要进行内核态和用户态的切换;表现为,如果顺序访问文件,fopen系列的 函数要比直接调用open系列快;如果随机访问文件open要比fopen快。
来自论坛的经典回答(open与fopen):
前者属于低级IO,后者是高级IO。
前者返回一个文件描述符(用户程序区的),后者返回一个文件指针。
前者无缓冲,后者有缓冲。
前者与 read, write 等配合使用, 后者与 fread, fwrite等配合使用。
后者是在前者的基础上扩充而来的,在大多数情况下,用后者。

0 0
原创粉丝点击