精华内容
下载资源
问答
  • C++文件操作函数-读写文件
    千次阅读
    2017-06-10 16:13:09

    文件读写是基础中的基础,关于此类知识的文章非常多,但还是想根据自己的使用心得去总结这么一些内容。

    1.文件的打开和关闭

    打开和关闭

    fopen()函数

    FILE *fopen(char *filename, *type);

    filename:可以包含 路径 和 文件名 两部分。如:“TEST.dat”、“C:\tc\TEST.dat”
    type:
    “r”打开文件只读。
    “w”创建文字文件只写。
    “a”增补,如果文件不存在则创建一个。
    “r+”打开一个文字文件读/写。
    “w+”创建一个文字文件读/写。
    “a+”打开或创建一个文件增补。
    “b”二进制文件(可以和以上每一项合并用)。
    “t”文本文件(默认项)。
    返回值:成功打开文件则返回文件指针;否则返回空指针(NULL)

    例:
    FILE *fp = fopen(strDEMFile.c_str(),_T("r"));//UNICODE以读方式打开文件
    【strDEMFile 是const string类型】
    另有:fopen_s()函数
    FILE*fp;
    fopen_s(&fp,strfileName.GetBuffer(),_T(“r”));//不能直接FILE *fp = fopen_s……
    【strfileName是CString类型,应该也可以是string类型,但不能用const修饰!】

    关闭

    fclose()函数

    int fclose(FILE *stream);//当文件关闭成功时,返回0,否则返回一个非0值;
    GetBuffer(); 本函数常见于文件的打开等数据操作,由于在很多情况下需要路径是const string类型,但路径变量又是非常量。用法见上

    文件的读写操作

    文件的顺序写

    fprintf()函数

    int fprintf (FILE *stream, const char *format,)
    FILE *stream:文件指针
    const char *format:输出格式
    < variable-list >(输出变量列表)
    返回值: 是输出的字符数,发生错误时返回EOF(值为-1)。
    例:
    fprintf (fp,"%d\n", i);//向文件写入一个整型 变量i

    fputs()-fputc函数

    int fputs ( const char * str, FILE * stream );//向文件写入一个字符串
    str:可以是字符型指针 或者 字符串常量
    FILE *stream:文件指针
    返回值:是输出的字符数,发生错误时返回EOF(值为-1)。
    例:
    fputs ("FuckWorld!\n", fp);

    int fputc ( int c, FILE *stream );//向文件写入一个字符
    c:可以是字符
    FILE *stream:文件指针
    返回值:是输出的字符数,发生错误时返回EOF(值为-1)。
    例:

    char strptr1[] = "This is a test of fputc!!\n";
    char *p;
    p = strptr1;
    while( (*p != '\0') && fputc(*(p++), fp) != EOF ) ;//这句话写的挺漂亮的

    fscanf()函数

    int fscanf ( FILE *stream, const char *format, );//顺序读取文件,遇空格和换行符结束
    FILE *stream:文件指针
    const char *format:输出格式
    (输出变量列表)
    返回值:成功,返回读入参数的个数;失败,返回EOF(值为-1)
    例:
    fscanf(fp, “%d”, &n);//加取地址符&
    fscanf(fp, “%s”, s);//注意:读入字符串时不要取地址符!【s 为char型,如:char s[10];】
    另有:fscanf_s()
    例:fscanf_s(fp, “%lf %lf”, &dX, &dY);//获取X,Y坐标【lf-double】

    fgets()函数

    char *fgets ( char *buf, intbufsize, FILE *stream );//按顺序读bufsize个字符串,遇到换行符结束
    *buf:字符型指针,指向用来存储所得数据的地址。
    bufsize: 整型数据,指明存储数据的大小。
    FILE *stream:文件指针
    返回值:成功,则返回第一个参数buf;在读字符时遇到end-of-file,则eof指示器被设置,如果还没读入任何字符就遇到这种情况,则buf保持原来的内容,返回NULL;如果发生读入错误,error指示器被设置,返回NULL,buf的值可能被改变。
    例:
    if( fgets( line, 100, stream ) == NULL)
    printf(“fgets error\n” );
    else
    printf( “%s”, line);//输出读取的字符串

    fgetc()函数

    int fgetc(FILE *stream);//按顺序读取文件,每次读取一个字符,读取后,光标位置后移一个字节。
    FILE *stream:文件指针
    返回值:成功,则返回所读取的一个字节;失败,(读到文件末尾或出错)则返回EOF

    二进制文件的读写(随机读写)

    常用读写方法:

    int fseek(FILE * stream, long offset, int fromwhere); //设置文件指针stream的位置
    int fread(void *buf, int size, int count, FILE *stream); //二进制读
    int fwrite(void *buf, int size, int count, FILE *stream); //二进制写
    long ftell(FILE *stream); //获取文件位置指针当前位置相对于文件首的偏移字节数

    Tips:
    fputs和fwrite函数在输入’\n’的时候,会最自动在前面添加一个’\r’,这样会导致最后输出的文本多一行空行,想要不自动加,则在fopen的时候就指定“b”参数(二进制文件)

    更多相关内容
  • C语言文件操作函数大全

    万次阅读 多人点赞 2018-01-19 20:35:35
    C语言文件操作函数大全 2018-1-19  13.1C语言文件 1,两种文件存取方式(输入,输出方式) 顺序存取 直接存取 2,数据的两种存放形式 文本文件 二进制文件 13.2文件指针 定义文件类型指针变量的一般...

    C语言文件操作函数大全

    2018-1-19 

    13.1C语言文件
    1,两种文件存取方式(输入,输出方式)
    顺序存取
    直接存取
    2,数据的两种存放形式
    文本文件
    二进制文件

    13.2文件指针
    定义文件类型指针变量的一般形式:
    FILE *指针变量名;
    例如:
    FILE *fp1,*fp2;

    13.3打开文件
    在使用文件之前,需打开文件.在C里使用fopen函数打开文件.格式为:
    fopen(文件名,文件使用方式);
    此函数返回一个指向FILE类型的指针.如:
    FILE *fp;
    fp=fopen("file_1","r");
    如果调用成功,fp就指向file_1,否则返回为NULL,所以为了保证文件的正确使用,要进行测试.采用如下语句:
    If((fp=fopen("file_1","r"))==NULL)
    {
    printf("Cannot open this file\n");
    exit(0);
    }
    最常用的文件使用方式及其含义如下:
    1,"r".为读而打开文本文件.(不存在则出错)
    2,"rb".为读而打开二进制文件.
    3,"w".为写而打开文本文件.(若不存在则新建,反之,则从文件起始位置写,原内容将被覆盖)
    4,"wb".为写而打开二进制文件.
    5,"a".为在文件后面添加数据而打开文本文件.(若不存在,则新建;反之,在原文件后追加)
    6,"ab".为在文件后面添加数据而打开一个二进制文件.
    最常用的文件使用方式及其含义如下:
    7,"r+".为读和写而打开文本文件.(读时,从头开始;在写数据时,新数据只覆盖所占的空间,其后不变)
    8,"rb+".为读和写而打开二进制文件.只是在随后的读写时,可以由位置函数设置读和写的起始位置.
    9,"w+".首先建立一个新文件,进行写操作,随后可以从头开始读.(若文件存在,原内容将全部消失)
    10,"wb+".功能与"w+"同.只是在随后的读写时,可以由位置函数设置读和写的起始位置.
    最常用的文件使用方式及其含义如下:
    11,"a+".功能与"a"相同;只是在文件尾部添加新的数据后,可以从头开始读.
    12,"ab+".功能与"a+"相同;只是在文件尾部添加新数据之后,可以由位置函数设置开始读的起始位置.

    13.4关闭文件

    当文件的读写操作完成之后,使用fclose函数关闭文件.格式如下:
    fclose(文件指针)
    如:fclose(fp);


    13.5调用getc(fgetc)和putc(fputc)函数进行输入和输出
    1,调用putc(或fputc)函数输出一个字符
    调用形式为:
    putc(ch,fp);
    功能是:将字符ch写到文件指针fp所指的文
    件中去.当输出成功,putc函数返回所输出的字符;否则,返回一个EOF值.EOF是在stdio.h库函数文件中定义的符号常量,其值等于-1.

    13.5调用getc(fgetc)和putc(fputc)函数进行输入和输出
    例如:把从键盘输入的文本按原样输出到名为file_1.dat文件中,用字符@作为键盘输入结束标志.
    #include
    Void main()
    {
    FILE *fpout;
    char ch;
    if(fpout=fpopen("file_1","w")==NULL)
    {
    printf("Cannot open this file!\n");
    exit(0);
    }
    ch=getchar();
    while(ch!='@')
    { fputc(ch,fpout); ch=getchar(); }
    fclose(fpout);
    }
    2.调用getc(或fgetc)函数输入一个字符
    调用形式为:
    ch=getc(pf);
    功能是:从pf指定的文件中读如一个字符,并把它作为函数值返回.
    例如:把一个已存在磁盘上的file_1.dat文本文件中的内容,原样输出到终端屏幕上.
    #include
    void main()

    {
    FILE *fpin;
    char ch;
    if((fpin=fopen("file_1.dat","r"))==NULL)

     printf("Cann't open this file!\n");

     exit(0);

    }
    ch=fgetc(fpin);//函数名: fgetc 功  能: 从流中读取字符
    while (ch!=EOF)

     putchar(ch); //函数名: putchar 功能: 在stdout上输出字符

     ch=fgetc(fpin);

    }
    fclose(fpin);
    }


    13.6判断文件结束函数feof
    EOF可以作为文本文件的结束 标志,但不能作为二进制文件的结束符.feof函数既可以判断二进制文件,又可以判断文本文件.
    例:编写程序,用于把一个文本文件(源)复制到另一个文件(目的)中,源文件名和目的文件名由命令行输入.命令形式如下:
    可执行程序名 源文件名 目的文件名
    #include
    void filecopy(FILE* ,FILE *);
    void main(int argc,char *argv[])

    {
    FILE *fpin,*fpout;
    if(argc==3)
    {

        fpin=fopen(argv[1],"r");
        fpout=fopen(argv[2],"w");
        filecopy(fpin,fpout);
        fclose(fpin);

       fclose(fpout);
    }
    else if(argc>3)
    printf("The file names too many!!\n";
    else
    printf("There are no file names for input or output!!\n );
    }
    void filecopy(FILE *fpin,FILE *fpout)
    {
    char ch;
    ch=getc(fpin);
    while(!feof(fpin))
    {putc(ch,fpout); ch=getc(fpin);}
    }


    13.7fscanf函数和fprintf函数
    1,fscanf函数
    fscanf只能从文本文件中按格式输入,和scanf函数相似,只不过输入的对象是磁盘上文本文件中的数据.调用形式为:
    fscanf(文件指针,格式控制字符串,输入项表)
    例如:fscanf(fp,"%d%d",&a,&b);
    fscanf(stdin,"%d%d",&a,&b);
    等价于scanf("%d%d",&a,&b);
    3.fprintf函数
    fprintf函数按格式将内存中的数据转换成对应的字符,并以ASCII代码形式输出到文本文件中.Fprintf函数和printf函数相似,只是将输出的内容按格式存放到磁盘的文本文件中.调用形式如下:
    fprintf(文件指针,格式控制字符串,输出项表)
    如:fprintf(fp,"%d %d",x,y);
    以下语句 fprintf(stdout,"%d %d",x,y)


    13.8fgets函数和fputs函数
    1,fgets函数
    fgets函数用来从文件中读入字符串.调用形式如下:
    fgets(str,n,fp);
    函数功能是:从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符时,则遇到换行符或一个EOF结束本次读操作,并已str作为函数值返回.
    13.8fgets函数和fputs函数
    2,fputs函数
    fput函数把字符串输出到文件中.函数调用形式如下:
    fputs(str,fp);
    注意:为了便于读入,在输出字符串时,应当人为的加诸如"\n"这样的字符串.

    #include <stdio.h>
    #include <iostream>

    int main(int argc, char *argv[])
    {
    char arr[10] ;
    char *ap = "hello!" ;//表示ap指向 hello! 这个字符串的首地址
    FILE *fp ;
    if ((fp = fopen("hello.txt", "wt+")) == NULL)
    {
        printf("error!") ;
        exit(1) ;
    }

    fputs(ap, fp) ;//函数名:fputs送一个字符到一个流中,用法: int fputs(char *string, FILE *stream);
    rewind(fp) ; //函数名: rewind将文件指针重新指向一个流的开头,用法: int rewind(FILE *stream); 
    fgets(arr, 10, fp) ;//从文件结构体指针fp中读取数据,每次读取一行。读取的数据保存在arr指向的字符数组中,
                                    每次最多读取n-1个字符(第n个字符赋'\0')
    printf("%s\n", arr) ;
    fclose(fp) ;
    return 0 ;
    }


    13.9fread函数和fwrite函数
    例如有如下结构体:
    struct st{
    char num[8];
    float mk[5];
    }pers[30];
    以下循环将把这30个元素中的数据输出到fp所指文件中.
    for(i=0;i<30;i++)
    fwrite(&pers[i],sizeof(struct st),1,fp);

    /*size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
    返回值:返回实际写入的数据块数目
    (1)buffer:是一个指针,对fwrite来说,是要获取数据的地址;
    (2)size:要写入内容的单字节数;
    (3)count:要进行写入size字节的数据项的个数;
    (4)stream:目标文件指针;
    (5)返回实际写入的数据项个数count。*/


    13.9fread函数和fwrite函数
    以下语句从fp所指的文件中再次将每个学生数据逐个读入到pers数组中.
    i=0;
    fread(&pers[i],sizeof(struct st),1,fp);
    while(!feof(fp))
    { i++;
    fread(&pers[i],sizeof(struct st),1,fp);
    }


    13.10文件定位函数
    1,fseek函数
    fseek函数用来移动文件位置指针到指定的位置上,接着的读或写操作将从此位置开始.函数的调用形式如下:
    fseek(pf,offset,origin)
    pf:文件指针
    offset:以字节为单位的位移量,为长整形.
    origin:是起始点,用来指定位移量是以哪个位置为基准的.
    1,fseek函数
    位移量的表示方法
    标识符 数字 代表的起始点
    SEEK_SET 0 文件开始
    SEEK_END 2 文件末尾
    SEEK_CUR 1 文件当前位置
    假设pf已指向一个二进制文件,则;
    fseek(pf,30L,SEEK_SET)
    fseek(pf,-10L*sizeof(int),SEEK_END)
    对于文本文件,位移量必须是0;如:
    fseek(pf,0L,SEEK_SET)//意思是把文件指针指向文件的开头
    fseek(pf,0L,SEEK_END)


    2. ftell函数
    ftell函数用以获得文件当前位置指针的位置,函数给出当前位置指针相对于文件开头的字节数.如;
    long t;
    t=ftell(pf);
    当函数调用出错时,函数返回-1L.
    我们可以通过以下方式来测试一个文件的长度:
    fseek(fp,0L,SEEK_END);
    t=ftell(fp);
    3.rewind函数
    调用形式为:rewind(pf);
    函数没有返回值.函数的功能是使文件的位置指针回到文件的开头.


    13.10文件应用
    在磁盘上的test.txt文件中放有10个不小于2的正整数,用函数调用方式编写程序.要求实现:
    1,在被调函数prime中,判断和统计10个整数中的素数以及个数.
    2,在主函数中将全部素数追加到磁盘文件test.txt的尾部,同时输出到屏幕上.
    #include
    #include
    Int prime(int a[],int n)
    {
    int i,j,k=0,flag=0;
    for(i=0;i { for(j=2;j if(a[i]%j==0)
    { flag=0; break;}
    else flag=1;
    if(flag)
    {a[k]=a[i];k++;}
    }
    return k;
    }
    void main(){
    int n,I,a[10];
    FILE *fp;
    fp=fopen("test1-2.txt","r+");
    for(n=0;n<10;n++)
    fscanf(fp,"%d",&a[n]);
    n=prime(a,n);
    fseek(fp,o,2);
    for(i=0;i {printf("%3d",a[i]);
    fprintf(fp,"%3d",a[i]);
    }
    fclose(fp);
    }

     

    clearerr(清除文件流的错误旗标)
    相关函数 feof
    表头文件 #include<stdio.h>
    定义函数 void clearerr(FILE * stream);
    函数说明 clearerr()清除参数stream指定的文件流所使用的错误旗标。
    它没有返回值,也未定义任何错误。

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

    fdopen(将文件描述词转为文件指针)
    相关函数 fopenopenfclose
    表头文件 #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!

    feof(检查文件流是否读到了文件尾)
    相关函数 fopenfgetcfgetsfread
    表头文件 #include<stdio.h>
    定义函数 int feof(FILE * stream);
    函数说明 feof()用来侦测是否读取到了文件尾,尾数streamfopen()所返回之文件指针。如果已到文件尾则返回非零值,其他情况返回0
    返回值 返回非零值代表已到达文件尾。

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

    fgetc(由文件中读取一个字符)
    相关函数 openfreadfscanfgetc
    表头文件 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);
    }

    fgets(由文件中读取一字符串)
    相关函数 openfreadfscanfgetc
    表头文件 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 /*输出*/


    fileno(返回文件流所使用的文件描述词)
    相关函数 openfopen
    表头文件 #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


    fopen(打开文件)
    相关函数 openfclose
    表头文件 #include<stdio.h>
    定义函数 FILE * fopen(const char * path,const char * mode);
    函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
    mode有下列几种形态字符串:
    r 打开只读文件,该文件必须存在。
    r+ 打开可读写的文件,该文件必须存在。
    w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
    w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
    a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
    a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
    上述的形态字符串都可以再加一个b字符,如rbw+bab+等组合,加入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);
    }

    fputc(将一指定字符写入文件流中)
    相关函数 fopenfwritefscanfputc
    表头文件 #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,fp);
    fclose(fp);
    }

    fputs(将一指定的字符串写入文件内)
    相关函数 fopenfwritefscanffputcputc
    表头文件 #include<stdio.h>
    定义函数 int fputs(const char * s,FILE * stream);
    函数说明 fputs()用来将参数s所指的字符串写入到参数stream所指的文件内。
    返回值 若成功则返回写出的字符个数,返回EOF则表示有错误发生。
    范例 请参考fgets()。
    fread(从文件流读取数据)
    相关函数 fopenfwritefseekfscanf
    表头文件 #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];
    int 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.name,i,s.size);
    }

    执行
    name[0]=Linux! size[0]=6
    name[1]=FreeBSD! size[1]=8
    name[2]=Windows2000 size[2]=11


    freopen(打开文件)
    相关函数 fopenfclose
    表头文件 #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);
    }

    fseek(移动文件流的读写位置)
    相关函数 rewindftellfgetposfsetposlseek
    表头文件 #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_CURSEEK_END时,参数offset允许负值的出现。
    下列是较特别的使用方式:
    1) 欲将读写位置移动到文件开头时:fseek(FILE *stream,0,SEEK_SET);
    2) 欲将读写位置移动到文件尾时:fseek(FILE *stream,0,0SEEK_END);
    返回值 当调用成功时则返回0,若有错误则返回-1errno会存放错误代码。
    附加说明 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


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

    fwrite(将数据写至文件流)
    相关函数 fopenfreadfseekfscanf
    表头文件 #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()。

    getc(由文件中读取一个字符)
    相关函数 readfopenfreadfgetc
    表头文件 #include<stdio.h>
    定义函数 int getc(FILE * stream);
    函数说明 getc()用来从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时便返回EOF。虽然getc()fgetc()作用相同,但getc()为宏定义,非真正的函数调用。
    返回值 getc()会返回读取到的字符,若返回EOF则表示到了文件尾。
    范例 参考fgetc()

    getchar(由标准输入设备内读进一字符)
    相关函数 fopenfreadfscanfgetc
    表头文件 #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=0li<5;i++)
    {
    c=getchar();
    putchar(c);
    }
    }

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

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

    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);
    }


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

    putchar(将指定的字符写到标准输出设备)
    相关函数 fopenfwritefscanffputc
    表头文件 #include<stdio.h>
    定义函数 int putchar (int c);
    函数说明 putchar()用来将参数c字符写到标准输出设备。
    返回值 putchar()会返回输出成功的字符,即参数c。若返回EOF则代表输出失败。
    附加说明 putchar()非真正函数,而是putc(cstdout)宏定义。
    范例 参考getchar()

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

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

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

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

    setvbuf(设置文件流的缓冲区)
    相关函数 setbuffersetlinebufsetbuf
    表头文件 #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。如果参数bufNULL指针,则为无缓冲IO
    返回值

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


    C语言文件操作函数

    2007-10-17 19:21

    13.1C语言文件
    1,两种文件存取方式(输入,输出方式)
    顺序存取
    直接存取
    2,数据的两种存放形式
    文本文件
    二进制文件

    13.2文件指针
    定义文件类型指针变量的一般形式:
    FILE *指针变量名;
    例如:
    FILE *fp1,*fp2;

    13.3打开文件
    在使用文件之前,需打开文件.在C里使用fopen函数打开文件.格式为:
    fopen(文件名,文件使用方式);
    此函数返回一个指向FILE类型的指针.如:
    FILE *fp;
    fp=fopen("file_1","r");
    如果调用成功,fp就指向file_1,否则返回为NULL,所以为了保证文件的正确使用,要进行测试.采用如下语句:
    If((fp=fopen("file_1","r"))==NULL)
    {
    printf("Cannot open this file\n");
    exit(0);
    }
    最常用的文件使用方式及其含义如下:
    1,"r".为读而打开文本文件.(不存在则出错)
    2,"rb".为读而打开二进制文件.
    3,"w".为写而打开文本文件.(若不存在则新建,反之,则从文件起始位置写,原内容将被覆盖)
    4,"wb".为写而打开二进制文件.
    5,"a".为在文件后面添加数据而打开文本文件.(若不存在,则新建;反之,在原文件后追加)
    6,"ab".为在文件后面添加数据而打开一个二进制文件.
    最常用的文件使用方式及其含义如下:
    7,"r+".为读和写而打开文本文件.(读时,从头开始;在写数据时,新数据只覆盖所占的空间,其后不变)
    8,"rb+".为读和写而打开二进制文件.只是在随后的读写时,可以由位置函数设置读和写的起始位置.
    9,"w+".首先建立一个新文件,进行写操作,随后可以从头开始读.(若文件存在,原内容将全部消失)
    10,"wb+".功能与"w+"同.只是在随后的读写时,可以由位置函数设置读和写的起始位置.
    最常用的文件使用方式及其含义如下:
    11,"a+".功能与"a"相同;只是在文件尾部添加新的数据后,可以从头开始读.
    12,"ab+".功能与"a+"相同;只是在文件尾部添加新数据之后,可以由位置函数设置开始读的起始位置.

    13.4关闭文件

    当文件的读写操作完成之后,使用fclose函数关闭文件.格式如下:
    fclose(文件指针)
    如:fclose(fp);


    13.5调用getc(fgetc)和putc(fputc)函数进行输入和输出
    1,调用putc(或fputc)函数输出一个字符
    调用形式为:
    putc(ch,fp);
    功能是:将字符ch写到文件指针fp所指的文
    件中去.当输出成功,putc函数返回所输出的字符;否则,返回一个EOF值.EOF是在stdio.h库函数文件中定义的符号常量,其值等于-1.

    13.5调用getc(fgetc)和putc(fputc)函数进行输入和输出
    例如:把从键盘输入的文本按原样输出到名为file_1.dat文件中,用字符@作为键盘输入结束标志.
    #include
    Void main()
    {
    FILE *fpout;
    char ch;
    if(fpout=fpopen("file_1","w")==NULL)
    {
    printf("Cannot open this file!\n");
    exit(0);
    }
    ch=getchar();
    while(ch!='@')
    { fputc(ch,fpout); ch=getchar(); }
    fclose(fpout);
    }
    2.调用getc(或fgetc)函数输入一个字符
    调用形式为:
    ch=getc(pf);
    功能是:从pf指定的文件中读如一个字符,并把它作为函数值返回.
    例如:把一个已存在磁盘上的file_1.dat文本文件中的内容,原样输出到终端屏幕上.
    #include
    void main(){
    FILE *fpin;
    char ch;
    if((fpin=fopen("file_1.dat","r"))==NULL)
    { printf("Cann't open this file!\n");exit(0);}
    ch=fgetc(fpin);
    while (ch!=EOF)
    { putchar(ch); ch=fgetc(fpin);}
    fclose(fpin);
    }


    13.6判断文件结束函数feof
    EOF可以作为文本文件的结束 标志,但不能作为二进制文件的结束符.feof函数既可以判断二进制文件,又可以判断文本文件.
    例:编写程序,用于把一个文本文件(源)复制到另一个文件(目的)中,源文件名和目的文件名由命令行输入.命令形式如下:
    可执行程序名 源文件名 目的文件名
    #include
    void filecopy(FILE* ,FILE *);
    void main(int argc,char *argv[]){
    FILE *fpin,*fpout;
    if(argc==3)
    { fpin=fopen(argv[1],"r");
    fpout=fopen(argv[2],"w");
    filecopy(fpin,fpout);
    fclose(fpin);fclose(fpout);
    }
    else if(argc>3)
    printf("The file names too many!!\n";
    else
    printf("There are no file names for input or output!!\n );
    }
    void filecopy(FILE *fpin,FILE *fpout)
    {
    char ch;
    ch=getc(fpin);
    while(!feof(fpin))
    {putc(ch,fpout); ch=getc(fpin);}
    }


    13.7fscanf函数和fprintf函数
    1,fscanf函数
    fscanf只能从文本文件中按格式输入,和scanf函数相似,只不过输入的对象是磁盘上文本文件中的数据.调用形式为:
    fscanf(文件指针,格式控制字符串,输入项表)
    例如:fscanf(fp,"%d%d",&a,&b);
    fscanf(stdin,"%d%d",&a,&b);
    等价于scanf("%d%d",&a,&b);
    3.fprintf函数
    fprintf函数按格式将内存中的数据转换成对应的字符,并以ASCII代码形式输出到文本文件中.Fprintf函数和printf函数相似,只是将输出的内容按格式存放到磁盘的文本文件中.调用形式如下:
    fprintf(文件指针,格式控制字符串,输出项表)
    如:fprintf(fp,"%d %d",x,y);
    以下语句 fprintf(stdout,"%d %d",x,y)


    13.8fgets函数和fputs函数
    1,fgets函数
    fgets函数用来从文件中读入字符串.调用形式如下:
    fgets(str,n,fp);
    函数功能是:从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符时,则遇到换行符或一个EOF结束本次读操作,并已str作为函数值返回.
    13.8fgets函数和fputs函数
    2,fputs函数
    fput函数把字符串输出到文件中.函数调用形式如下:
    fputs(str,fp);
    注意:为了便于读入,在输出字符串时,应当人为的加诸如"\n"这样的字符串.

    #include <stdio.h>
    #include <iostream>

    int main(int argc, char *argv[])
    {
    char arr[10] ;
    char *ap = "hello!" ;
    FILE *fp ;
    if ((fp = fopen("hello.txt", "wt+")) == NULL)
    {
        printf("error!") ;
        exit(1) ;
    }
          fputs(ap, fp) ;

    rewind(fp) ; //

    fgets(arr, 10, fp) ;
    printf("%s\n", arr) ;
    fclose(fp) ;
    return 0 ;
    }

     


    13.9fread函数和fwrite函数
    例如有如下结构体:
    struct st{
    char num[8];
    float mk[5];
    }pers[30];
    以下循环将把这30个元素中的数据输出到fp所指文件中.
    for(i=0;i<30;i++)
    fwrite(&pers[i],sizeof(struct st),1,fp);


    13.9fread函数和fwrite函数
    以下语句从fp所指的文件中再次将每个学生数据逐个读入到pers数组中.
    i=0;
    fread(&pers[i],sizeof(struct st),1,fp);
    while(!feof(fp))
    { i++;
    fread(&pers[i],sizeof(struct st),1,fp);
    }


    13.10文件定位函数
    1,fseek函数
    fseek函数用来移动文件位置指针到指定的位置上,接着的读或写操作将从此位置开始.函数的调用形式如下:
    fseek(pf,offset,origin)
    pf:文件指针
    offset:以字节为单位的位移量,为长整形.
    origin:是起始点,用来指定位移量是以哪个位置为基准的.
    1,fseek函数
    位移量的表示方法
    标识符 数字 代表的起始点
    SEEK_SET 0 文件开始
    SEEK_END 2 文件末尾
    SEEK_CUR 1 文件当前位置
    假设pf已指向一个二进制文件,则;
    fseek(pf,30L,SEEK_SET)
    fseek(pf,-10L*sizeof(int),SEEK_END)
    对于文本文件,位移量必须是0;如:
    fseek(pf,0L,SEEK_SET)
    fseek(pf,0L,SEEK_END)
    2. ftell函数
    ftell函数用以获得文件当前位置指针的位置,函数给出当前位置指针相对于文件开头的字节数.如;
    long t;
    t=ftell(pf);
    当函数调用出错时,函数返回-1L.
    我们可以通过以下方式来测试一个文件的长度:
    fseek(fp,0L,SEEK_END);
    t=ftell(fp);
    3.rewind函数
    调用形式为:
    rewind(pf);
    函数没有返回值.函数的功能是使文件的位置指针回到文件的开头.


    13.10文件应用
    在磁盘上的test.txt文件中放有10个不小于2的正整数,用函数调用方式编写程序.要求实现:
    1,在被调函数prime中,判断和统计10个整数中的素数以及个数.
    2,在主函数中将全部素数追加到磁盘文件test.txt的尾部,同时输出到屏幕上.
    #include
    #include
    Int prime(int a[],int n)
    {
    int I,j,k=0,flag=0;
    for(i=0;i { for(j=2;j if(a[i]%j==0)
    { flag=0; break;}
    else flag=1;
    if(flag)
    {a[k]=a[i];k++;}
    }
    return k;
    }
    void main(){
    int n,I,a[10];
    FILE *fp;
    fp=fopen("test1-2.txt","r+");
    for(n=0;n<10;n++)
    fscanf(fp,"%d",&a[n]);
    n=prime(a,n);
    fseek(fp,o,2);
    for(i=0;i {printf("%3d",a[i]);
    fprintf(fp,"%3d",a[i]);
    }
    fclose(fp);
    }

     

     

    文件操作函数全

    clearerr(清除文件流的错误旗标)
    相关函数 feof
    表头文件 #include<stdio.h>
    定义函数 void clearerr(FILE * stream);
    函数说明 clearerr()清除参数stream指定的文件流所使用的错误旗标。
    返回值

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

    fdopen(将文件描述词转为文件指针)
    相关函数 fopenopenfclose
    表头文件 #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!

    feof(检查文件流是否读到了文件尾)
    相关函数 fopenfgetcfgetsfread
    表头文件 #include<stdio.h>
    定义函数 int feof(FILE * stream);
    函数说明 feof()用来侦测是否读取到了文件尾,尾数streamfopen()所返回之文件指针。如果已到文件尾则返回非零值,其他情况返回0
    返回值 返回非零值代表已到达文件尾。

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

    fgetc(由文件中读取一个字符)
    相关函数 openfreadfscanfgetc
    表头文件 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);
    }

    fgets(由文件中读取一字符串)
    相关函数 openfreadfscanfgetc
    表头文件 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 /*输出*/


    fileno(返回文件流所使用的文件描述词)
    相关函数 openfopen
    表头文件 #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


    fopen(打开文件)
    相关函数 openfclose
    表头文件 #include<stdio.h>
    定义函数 FILE * fopen(const char * path,const char * mode);
    函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
    mode有下列几种形态字符串:
    r 打开只读文件,该文件必须存在。
    r+ 打开可读写的文件,该文件必须存在。
    w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
    w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
    a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
    a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
    上述的形态字符串都可以再加一个b字符,如rbw+bab+等组合,加入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);
    }

    fputc(将一指定字符写入文件流中)
    相关函数 fopenfwritefscanfputc
    表头文件 #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,fp);
    fclose(fp);
    }

    fputs(将一指定的字符串写入文件内)
    相关函数 fopenfwritefscanffputcputc
    表头文件 #include<stdio.h>
    定义函数 int fputs(const char * s,FILE * stream);
    函数说明 fputs()用来将参数s所指的字符串写入到参数stream所指的文件内。
    返回值 若成功则返回写出的字符个数,返回EOF则表示有错误发生。
    范例 请参考fgets()。
    fread(从文件流读取数据)
    相关函数 fopenfwritefseekfscanf
    表头文件 #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];
    int 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.name,i,s.size);
    }

    执行
    name[0]=Linux! size[0]=6
    name[1]=FreeBSD! size[1]=8
    name[2]=Windows2000 size[2]=11


    freopen(打开文件)
    相关函数 fopenfclose
    表头文件 #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);
    }

    fseek(移动文件流的读写位置)
    相关函数 rewindftellfgetposfsetposlseek
    表头文件 #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_CURSEEK_END时,参数offset允许负值的出现。
    下列是较特别的使用方式:
    1) 欲将读写位置移动到文件开头时:fseek(FILE *stream,0,SEEK_SET);
    2) 欲将读写位置移动到文件尾时:fseek(FILE *stream,0,0SEEK_END);
    返回值 当调用成功时则返回0,若有错误则返回-1errno会存放错误代码。
    附加说明 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


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

    fwrite(将数据写至文件流)
    相关函数 fopenfreadfseekfscanf
    表头文件 #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()。

    getc(由文件中读取一个字符)
    相关函数 readfopenfreadfgetc
    表头文件 #include<stdio.h>
    定义函数 int getc(FILE * stream);
    函数说明 getc()用来从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时便返回EOF。虽然getc()fgetc()作用相同,但getc()为宏定义,非真正的函数调用。
    返回值 getc()会返回读取到的字符,若返回EOF则表示到了文件尾。
    范例 参考fgetc()

    getchar(由标准输入设备内读进一字符)
    相关函数 fopenfreadfscanfgetc
    表头文件 #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=0li<5;i++)
    {
    c=getchar();
    putchar(c);
    }
    }

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

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

    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);
    }


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

    putchar(将指定的字符写到标准输出设备)
    相关函数 fopenfwritefscanffputc
    表头文件 #include<stdio.h>
    定义函数 int putchar (int c);
    函数说明 putchar()用来将参数c字符写到标准输出设备。
    返回值 putchar()会返回输出成功的字符,即参数c。若返回EOF则代表输出失败。
    附加说明 putchar()非真正函数,而是putc(cstdout)宏定义。
    范例 参考getchar()

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

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

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

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

    setvbuf(设置文件流的缓冲区)
    相关函数 setbuffersetlinebufsetbuf
    表头文件 #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。如果参数bufNULL指针,则为无缓冲IO
    返回值

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

     

    展开全文
  • C语言文件操作函数详解

    千次阅读 多人点赞 2018-08-26 23:20:43
    C语言中没有输入输出语句,所有的输入输出功能都用 ...文件操作标准库函数有:  文件的打开操作 fopen 打开一个文件  文件的关闭操作 fclose 关闭一个文件  文件的读写操作 fgetc 从文件中读取一个字符  ...

    转载自https://www.cnblogs.com/saolv/p/7793379.html

    C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现。文件操作标准库函数有:
          文件的打开操作 fopen 打开一个文件
          文件的关闭操作 fclose 关闭一个文件
          文件的读写操作 fgetc 从文件中读取一个字符
                  fputc 写一个字符到文件中去
                  fgets 从文件中读取一个字符串
                  fputs 写一个字符串到文件中去
                  fprintf 往文件中写格式化数据
                  fscanf 格式化读取文件中数据
                  fread 以二进制形式读取文件中的数据
                  fwrite 以二进制形式写数据到文件中去
                  getw 以二进制形式读取一个整数
                  putw 以二进制形式存贮一个整数
        文件状态检查函数 feof 文件结束
                  ferror 文件读/写出错
                  clearerr 清除文件错误标志
                  ftell 了解文件指针的当前位置
          文件定位函数 rewind 反绕
                  fseek 随机定位

    “r”.为读而打开文本文件.(不存在则出错)
    “w”.为写而打开文本文件.(若不存在则新建,反之,则从文件起始位置写,原内容将被覆盖)
    “a”.为在文件后面添加数据而打开文本文件.(若不存在,则新建;反之,在原文件后追加)

    “r+”.为读和写而打开文本文件.(读时,从头开始;在写数据时,新数据只覆盖所占的空间,其后不变)

    “wb”.为写而打开二进制文件.
    “rb”.为读而打开二进制文件
    “ab”.为在文件后面添加数据而打开一个二进制文件.

    “rb+”.为读和写而打开二进制文件.只是在随后的读写时,可以由位置函数设置读和写的起始位置.

    “w+”.首先建立一个新文件,进行写操作,随后可以从头开始读.(若文件存在,原内容将全部消失)
    “a+”.功能与”a”相同;只是在文件尾部添加新的数据后,可以从头开始读.
    “wb+”.功能与”w+”同.只是在随后的读写时,可以由位置函数设置读和写的起始位置.
    “ab+”.功能与”a+”相同;只是在文件尾部添加新数据之后,可以由位置函数设置开始读的起始位置.

    文件的打开

     1.函数原型

    FILE *fopen(char *pname,char *mode)
     2.功能说明
       按照mode 规定的方式,打开由pname指定的文件。若找不到由pname指定的相应文件,就按以下方式之一处理:
    (1) 此时如mode 规定按写方式打开文件,就按由pname指定的名字建立一个新文件;
    (2) 此时如mode 规定按读方式打开文件,就会产生一个错误。
    打开文件的作用是:
    (1)分配给打开文件一个FILE 类型的文件结构体变量,并将有关信息填入文件结构体变量;
    (2)开辟一个缓冲区;
    (3)调用操作系统提供的打开文件或建立新文件功能,打开或建立指定文件;
    FILE *:指出fopen是一个返回文件类型的指针函数;
     3.参数说明
    pname:是一个字符指针,它将指向要打开或建立的文件的文件名字符串。
    mode:是一个指向文件处理方式字符串的字符指针。所有可能的文件处理方式见表8.1
     4.返回值
       正常返回:被打开文件的文件指针。
       异常返回:NULL,表示打开操作不成功。
    例如:

    //定义一个名叫fp文件指针
    FILE *fp;
    //判断按读方式打开一个名叫test的文件是否失败
    if((fp=fopen(”test”,”r”)) == NULL)//打开操作不成功
    {
    printf(“The file can not be opened.\n”);  
    exit(1);//结束程序的执行
    }

     要说明的是:C语言将计算机的输入输出设备都看作是文件。例如,键盘文件、屏幕文件等。ANSI C标准规定,在执行程序时系统先自动打开键盘、屏幕、错误三个文件。这三个文件的文件指针分别是:标准输入stdin、标准输出stdout和标准出错 stderr。
    * 文件的关闭
    1. 函数原型

    int fclose(FILE *fp);
    2. 功能说明
      关闭由fp指出的文件。此时调用操作系统提供的文件关闭功能,关闭由fp->fd指出的文件;释放由fp指出的文件类型结构体变量;返回操作结果,即0或EOF。
    3. 参数说明
      fp:一个已打开文件的文件指针。
    4. 返回值
      正常返回:0。
      异常返回:EOF,表示文件在关闭时发生错误。
    例如:

    int n=fclose(fp);
    *文件的读写操作
    A. 从文件中读取一个字符
      1. 函数原型

    int fgetc(FILE *fp);
      2. 功能说明
        从fp所指文件中读取一个字符。
      3. 参数说明
        fp:这是个文件指针,它指出要从中读取字符的文件。
      4. 返回值
        正常返回: 返回读取字符的代码。
        非正常返回:返回EOF。例如,要从”写打开”文件中读取一个字符时,会发生错误而返回一个EOF。

    B. 写一个字符到文件中去
    1. 函数原型

    int fputc(int ch,FILE *fp)
    2. 功能说明
      把ch中的字符写入由fp指出的文件中去。
    3. 参数说明
      ch:是一个整型变量,内存要写到文件中的字符(C语言中整型量和字符量可以通用)。
      fp:这是个文件指针,指出要在其中写入字符的文件。
    4. 返回值
      正常返回: 要写入字符的代码。
      非正常返回:返回EOF。例如,要往”读打开”文件中写一个字符时,会发生错误而返回一个EOF。

    C. 从文件中读取一个字符串
    1. 函数原型
      char *fgets(char *str,int n,FILE *fp)
    2. 功能说明
      从由fp指出的文件中读取n-1个字符,并把它们存放到由str指出的字符数组中去,最后加上一个字符串结束符’\0’。
    3. 参数说明
      str:接收字符串的内存地址,可以是数组名,也可以是指针。
      n: 指出要读取字符的个数。
      fp:这是个文件指针,指出要从中读取字符的文件。
    4. 返回值
    正常返回:返回字符串的内存首地址,即str的值。
    非正常返回:返回一个NULL值,此时应当用feof()或ferror()函数来判别是读取到了文件尾,还是发生了错误。例如,要从”写打开”文件中读取字符串,将
    发生错误而返回一个NULL值。

    D. 写一个字符串到文件中去
    1. 函数原型

    int fputs(char *str,FILE *fp)
    2. 功能说明
      把由str指出的字符串写入到fp所指的文件中去。
    3. 参数说明
      str:指出要写到文件中去的字符串。
      fp:这是个文件指针,指出字符串要写入其中的文件。
    4. 返回值
      正常返回: 写入文件的字符个数,即字符串的长度。
      非正常返回:返回一个NULL值,此时应当用feof()或ferror()函数来判别是读取到了文件尾,还是发生了错误。例如,要往一个”读打开” 文件中写字符串时,
    会发生错误而返回一个NULL值。

    E. 往文件中写格式化数据
    1.函数原型

    int fprintf(FILE *fp,char *format,arg_list)
    2.功能说明
      将变量表列(arg_list)中的数据,按照format指出的格式,写入由fp指定的文件。fprintf()函数与printf()函数的功能相同,只是printf()函数是将数据写入屏幕文件(stdout)。
    3.参数说明
      fp:这是个文件指针,指出要将数据写入的文件。
      format:这是个指向字符串的字符指针,字符串中含有要写出数据的格式,所以该字符串成为格式串。格式串描述的规则与printf()函数中的格式串相同。
    arg_list:是要写入文件的变量表列,各变量之间用逗号分隔。
    4.返回值
      无。

    G. 以二进制形式读取文件中的数据
    1. 函数原型

    int fread(void *buffer,unsigned sife,unsigned count,FILE *fp)
    2. 功能说明
      从由fp指定的文件中,按二进制形式将sife*count个数据读到由buffer指出的数据区中。
    3. 参数说明
    buffer:这是一个void型指针,指出要将读入数据存放在其中的存储区首地址。
    sife:指出一个数据块的字节数,即一个数据块的大小尺寸。
    count:指出一次读入多少个数据块(sife)。
    fp:这是个文件指针,指出要从其中读出数据的文件。
    4.返回值
      正常返回:实际读取数据块的个数,即count。
      异常返回:如果文件中剩下的数据块个数少于参数中count指出的个数,或者发生了错误,返回0值。此时可以用feof()和ferror()来判定到底出现了什么
    情况。
    H. 以二进制形式写数据到文件中去
    1. 函数原型

    int fwrite(void *buffer,unsigned sife,unsigned count,FILE *fp)
    2. 功能说明
      按二进制形式,将由buffer指定的数据缓冲区内的sife*count个数据写入由fp指定的文件中去。
    3. 参数说明
    buffer:这是一个void型指针,指出要将其中数据输出到文件的缓冲区首地址。
    sife:指出一个数据块的字节数,即一个数据块的大小尺寸。
    count:一次输出多少个数据块(sife)。
    fp:这是个文件指针,指出要从其中读出数据的文件。
    4.返回值
      正常返回:实际输出数据块的个数,即count。
      异常返回:返回0值,表示输出结束或发生了错误。

    I. 以二进制形式读取一个整数
    1. 函数原型

    int getw(FILE *fp)
    2. 功能说明
      从由fp指定的文件中,以二进制形式读取一个整数。
    3. 参数说明
      fp:是文件指针。
    4. 返回值
      正常返回:所读取整数的值。
      异常返回:返回EOF,即-1。由于读取的整数值有可能是-1,所以必须用feof()或ferror()来判断是到了文件结束,还是出现了一个出错。

    • 文件状态检查
      A. 文件结束
      (1) 函数原型

    int feof(FILE *fp)
    (2) 功能说明
       该函数用来判断文件是否结束。
    (3) 参数说明
       fp:文件指针。
    (4) 返回值
       0:假值,表示文件未结束。
       1:真值,表示文件结束。
    B. 文件读/写出错
    (1) 函数原型

    int ferror(FILE *fp)
    (2) 功能说明
       检查由fp指定的文件在读写时是否出错。
    (3) 参数说明
       fp:文件指针。
    (4) 返回值
       0:假值,表示无错误。
       1:真值,表示出错。
    C. 清除文件错误标志
    (1) 函数原型

    void clearerr(FILE *fp)
    (2) 功能说明
       清除由fp指定文件的错误标志。
    (3) 参数说明
       fp:文件指针。
    (4) 返回值
       无。
       
    D. 了解文件指针的当前位置
    (1) 函数原型

    long ftell(FILE *fp)
    (2) 功能说明
       取得由fp指定文件的当前读/写位置,该位置值用相对于文件开头的位移量来表示。
    (3) 参数说明
       fp:文件指针。
    (4) 返回值
       正常返回:位移量(这是个长整数)。
       异常返回:-1,表示出错。

    A. 反绕
    (1) 函数原型

    void rewind(FILE *fp)
    (2) 功能说明
       使由文件指针fp指定的文件的位置指针重新指向文件的开头位置。
    (3) 参数说明
       fp:文件指针。
    (4) 返回值
       无。

    B. 随机定位
    (1) 函数原型

    int fseek(FILE *fp,long offset,int base)
    (2) 功能说明
       使文件指针fp移到基于base的相对位置offset处。
    (3)参数说明
       fp:文件指针。
       offset:相对base的字节位移量。这是个长整数,用以支持大于64KB的文件。
       base:文件位置指针移动的基准位置,是计算文件位置指针位移的基点。ANSI C定义了base的可能取值,以及这些取值的符号常量。
    (4)返回值
      正常返回:当前指针位置。
      异常返回:-1,表示定位操作出错。

    • 关于exit()函数
      1. 函数原型

    void exit(int status)
    2. 功能说明
      exit()函数使程序立即终止执行,同时将缓冲区中剩余的数据输出并关闭所有已经打开的文件。
    3. 参数说明
      status:为0值表示程序正常终止,为非0值表示一个定义错误。
    4. 返回值
      无。
    * 关于feof()函数
    1. 函数原型

    int feof(FILE *fp)
    2. 功能说明
       在文本文件(ASCII文件)中可以用值为-1的符号常量EOF来作为文件的结束符。但是在二进制文件中-1往往可能是一个有意义的数据,因此不能用它 来作为文件的结束标志。为了能有效判别文件是否结束,ANSI C提供了标准函数feof(),用来识别文件是否结束。
    3. 参数说明
      fp:文件指针。
    4. 返回值
      返回为非0值:已到文件尾。
      返回为0值:表示还未到文件尾。

    展开全文
  • 1. open()函数功能描述:用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数。所需头文件:#include &lt;sys/types.h&gt;,#include &lt;sys/stat.h&gt;,#include &...

    1. open()函数

    功能描述:用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数。

    所需头文件:#include <sys/types.h>,#include <sys/stat.h>,#include <fcntl.h>

    函数原型:int open(const char *pathname,int flags,int perms)

    参数:

    pathname:被打开的文件名(可包括路径名如"dev/ttyS0")

    flags:文件打开方式,

    O_RDONLY:以只读方式打开文件

    O_WRONLY:以只写方式打开文件

    O_RDWR:以读写方式打开文件

    O_CREAT:如果改文件不存在,就创建一个新的文件,并用第三个参数为其设置权限

    O_EXCL:如果使用O_CREAT时文件存在,则返回错误消息。这一参数可测试文件是否存在。此时open是原子操作,防止多个进程同时创建同一个文件

    O_NOCTTY:使用本参数时,若文件为终端,那么该终端不会成为调用open()的那个进程的控制终端
    O_TRUNC:若文件已经存在,那么会删除文件中的全部原有数据,并且设置文件大小为0
    O_APPEND:以添加方式打开文件,在打开文件的同时,文件指针指向文件的末尾,即将写入的数据添加到文件的末尾

    O_NONBLOCK: 如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I/O操作设置非阻塞方式。

    O_SYNC:使每次write都等到物理I/O操作完成。
    O_RSYNC:read 等待所有写入同一区域的写操作完成后再进行
    在open()函数中,falgs参数可以通过“|”组合构成,但前3个标准常量(O_RDONLY,O_WRONLY,和O_RDWR)不能互相组合。

    perms:被打开文件的存取权限,可以用两种方法表示,可以用一组宏定义:S_I(R/W/X)(USR/GRP/OTH),其中R/W/X表示读写执行权限,

    USR/GRP/OTH分别表示文件的所有者/文件所属组/其他用户,如S_IRUUR|S_IWUUR|S_IXUUR,(-rex------),也可用八进制800表示同样的权限

    返回值:

    成功:返回文件描述符

    失败:返回-1

     

    2. close()函数

    功能描述:用于关闭一个被打开的的文件

    所需头文件: #include <unistd.h>

    函数原型:int close(int fd)

    参数:fd文件描述符

    函数返回值:0成功,-1出错

     

    3. read()函数

    功能描述: 从文件读取数据。
    所需头文件: #include <unistd.h>

    函数原型:ssize_t read(int fd, void *buf, size_t count);

    参数:  
    fd: 将要读取数据的文件描述词。
    buf:指缓冲区,即读取的数据会被放到这个缓冲区中去。
    count: 表示调用一次read操作,应该读多少数量的字符。

    返回值:返回所读取的字节数;0(读到EOF);-1(出错)。

    以下几种情况会导致读取到的字节数小于 count :

        A. 读取普通文件时,读到文件末尾还不够 count 字节。例如:如果文件只有 30 字节,而我们想读取 100
    字节,那么实际读到的只有 30 字节,read 函数返回 30 。此时再使用 read 函数作用于这个文件会导致 read 返回 0 。
        B. 从终端设备(terminal device)读取时,一般情况下每次只能读取一行。
        C. 从网络读取时,网络缓存可能导致读取的字节数小于 count字节。
        D. 读取 pipe 或者 FIFO 时,pipe 或 FIFO 里的字节数可能小于 count 。
        E. 从面向记录(record-oriented)的设备读取时,某些面向记录的设备(如磁带)每次最多只能返回一个记录。
        F. 在读取了部分数据时被信号中断。
    读操作始于 cfo 。在成功返回之前,cfo 增加,增量为实际读取到的字节数。

     

    4. write()函数

    功能描述: 向文件写入数据。
    所需头文件: #include <unistd.h>

    函数原型:ssize_t write(int fd, void *buf, size_t count);

    返回值:写入文件的字节数(成功);-1(出错)

    功能:write 函数向 filedes 中写入 count 字节数据,数据来源为 buf 。返回值一般总是等于 count,否则就是出错了。常见的出错原因是磁盘空间满了或者超过了文件大小限制。

    对于普通文件,写操作始于 cfo 。如果打开文件时使用了 O_APPEND,则每次写操作都将数据写入文件末尾。成功写入后,cfo 增加,增量为实际写入的字节数。

    5. lseek()函数 

    功能描述: 用于在指定的文件描述符中将将文件指针定位到相应位置。
    所需头文件: #include <unistd.h>,#include <sys/types.h>

    函数原型:off_t lseek(int fd, off_t offset,int whence);

    参数:

    fd;文件描述符

    offset:偏移量,每一个读写操作所需要移动的距离,单位是字节,可正可负(向前移,向后移)

    whence:

    SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小

    SEEK_CUR:当前位置为指针的位置,新位置为当前位置加上偏移量

    SEEK_END:当前位置为文件的结尾,新位置为文件大小加上偏移量的大小

    返回值:

    成功:返回当前位移

    失败:返回-1

    6.函数实例1

    #include <stdio.h>

    #include <string.h>
    #include <stdlib.h>  
    #include <unistd.h>
    #include <fcntl.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include <errno.h>


    #define BUFFER_SIZE 128                               //每次读写缓存大小,影响运行效率
    #define SRC_FILE_NAME "src_file.txt"              //源文件名
    #define DEST_FILE_NAME "dest_file.txt"          //目标文件名
    #define OFFSET 0                                             //文件指针偏移量

    int main()
    {
          int src_file,dest_file;
          unsigned char src_buff[BUFFER_SIZE];
          unsigned char dest_buff[BUFFER_SIZE];
          int real_read_len = 0;
          char str[BUFFER_SIZE] = "this is a testabout\nopen()\nclose()\nwrite()\nread()\nlseek()\nend of the file\n";

         

          //创建源文件

          src_file=open(SRC_FILE_NAME,O_RDWR|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);  
          if(src_file<0)
          {
                printf("open file error!!!\n");
                exit(1);
          }

        

         //向源文件中写数据

        write(src_file,str,sizeof(str));

         

         //创建目的文件

         dest_file=open(DEST_FILE_NAME,O_RDWR|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);  
          if(dest_file<0)
          {
              printf("open file error!!!\n");
                exit(1);
          }
        
          lseek(src_file,OFFSET,SEEK_SET);//将源文件的读写指针移到起始位置
          while((real_read_len=read(src_file,src_buff,sizeof(src_buff)))>0)
          {
            printf("src_file:%s",src_buff);
                write(dest_file,src_buff,real_read_len);
          }
        lseek(dest_file,OFFSET,SEEK_SET);//将目的文件的读写指针移到起始位置
        while((real_read_len=read(dest_file,dest_buff,sizeof(dest_buff)))>0);//读取目的文件的内容
        printf("dest_file:%s",dest_buff);

          close(src_file);
          close(dest_file);
          return 0;
    }

    结果 如下:
    src_file:this is a test about
    open()
    close()
    write()
    read()
    lseek()
    end of the file
    dest_file:this is a test about
    open()
    close()
    write()
    read()
    lseek()

    end of the file

    函数实例2

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>  
    #include <unistd.h>
    #include <fcntl.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include <errno.h>

    #define BUFFER_SIZE 1024
    #define OFFSET 0                          //文件指针偏移量
    #define IP_FILE "ip.txt"
    int creat_fd,write_fd,open_fd;
    char readbuf[BUFFER_SIZE];
    char writebuf[]="192.168.1.1";

    int main(int argc, char *argv[])
    {
    int ret=1;
    int file_len=0;

    #if 0
    /* 导入参数 */  
    //para1:command name para2:filename

    if (argc != 2)
    {
    printf("argc number error!need 2,support %d\n",argc);
    exit(1);
    }

    #endif

    //creat file

    creat_fd=open(IP_FILE,O_RDWR|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); 
    if(creat_fd<0)
          {
            printf("creat serverip file error!!!\n");
            exit(1);
          }


    //write data to file

    write_fd=write(creat_fd,writebuf,sizeof(writebuf));

    if(write_fd<0)
          {
            printf("write data to serverip.txt error!!!\n");
            exit(1);
          }

    //open file
    //open_fd= open(argv[1],O_RDWR);

    open_fd= open(SERVERIP_FILE,O_RDWR);
    if(open_fd<0)
    {
    printf("read file error!!!\n");
    exit(1);
    }

    //测量文件大小
    //off_t lseek(int fd, off_t offset,int whence);

    file_len=lseek(open_fd,OFFSET,SEEK_END);//返回值为文件大小+offset
    lseek(open_fd,OFFSET,SEEK_SET);         //重定位文件开始
    printf("file size=%d\n",file_len);


    //read file
    //ssize_t read(int fd, void *buf, size_t count); 
    //文件读写位置会随读取到的字节移动,如果返回0,表示已到达文件尾或是无可读取的数据

    while(ret)
    {

    ret=read(open_fd,readbuf,BUFFER_SIZE);

    if(ret == -1)
    {
    printf("read file error!!!\n");
    exit(1);
    }
    file_len-=ret;
    }

    printf("there are %d byte(s) data left without read\n", file_len);
    printf("%s\n",readbuf);

    //close file 
    close(open_fd);


    return 0;
    }

    展开全文
  • 使用C#语言中的File类我们能够非常轻松的使用一些文件操作函数来完成对文件简单的读写操作: ReadAllByte()函数,将文件中的文字内容转成byte数组并返回。 案例)读取文件,并输出到控制台上 【准备读取的文件】...
  • 文件操作函数(三)—— 文件的随机读写

    千次阅读 多人点赞 2021-03-20 16:10:36
    文章目录 前言 fseek函数 ftell函数 rewind函数 拓:用fseek函数与ftell函数求文件大小 前言 在文件操作函数(二)中,我们介绍了文件的顺序读写函数,即挨着顺序对文件中的数据进行输入或输出操作的函数。...
  • 作用:获得文件信息,也可以获取文件大小。 头文件: 参数说明: path 文件名 buf 传出参数,定义结构体 struct stat sb; &sb 返回值 失败:返回 -1,设置 errno 成功:返回 0 注意: stat 碰到链接,...
  • C语言文件操作相关函数

    千次阅读 多人点赞 2019-04-22 11:41:20
    我们就需要掌握一些文件操作函数了。 文件名 一个文件要有一个唯一的文件标识,以便用户识别和引用。文件名包含:文件路径+文件名主干+文件后缀 在电脑中一个文件名为: 但在程序中,为了与一些转移字符区分开,...
  • VC++文件操作函数解析

    千次阅读 2012-08-29 16:50:08
    ftell:功 能:返回当前文件... 函数功能:函数 ftell() 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。使用fseek函数
  • 我把文件指针都关闭了,可是调用rename(重命名文件)和remove(删除文件函数都不...把中间对文件操作注释掉也一样,不知道哪里出了问题。。。两个函数的返回值都是-1,我也去查了原因,网络上讲解的好像都不是呀
  • Linux C的文件操作及相关函数

    千次阅读 2016-10-16 21:14:39
    三、不带缓存的文件I/O操作的相关函数 一、Linux文件的属性 文件的属性: 我们在Gcc编译器输入“ ls -al"指令时,除了有不同的类型外还有一些字母串如”drwx-wx-wx",除第一个字符外(表示文件类型:例如...
  • LINUX下文件操作函数

    万次阅读 2009-11-10 15:13:00
    Linux的文件操作API涉及到创建、打开、读写和关闭文件。1.linux API 创建int creat(const char *filename, mode_t mode); 参数mode指定新建文件的存取权限,它同umask一起决定文件的最终权限(mode&umask),其中...
  •  在c中,文件操作都是由库函数来实现的,主要是分为读和写两种操作,以下详细讲解以下所有有关文件操作的邯郸乎的用法: (1)fopen()函数:打开文 包含头文件:#include 格式:FILE * fopen(const char * ...
  • Python提供了多种文件操作方式,这里简单介绍os.open、io.open、内置函数open之间的关系: 一、内置函数open和io.open实际上是同一个函数,后者是前者的别名; 二、os.open与内置函数open的关系 os.open是文件操作...
  • 【C 语言】文件操作 ( fread 函数 )

    千次阅读 多人点赞 2021-05-27 21:48:00
    二、缓冲区受限的情况 ( 循环读取文件 | feof 函数判定文件读取完毕 )、 三、处理乱码问题、 四、记录读取的字节个数、 五、读取到 0 字节的情况、 六、读取完毕的情况、 七、读取文本文件 "\n" 与 读取二进制文件 ...
  • c++文件操作大全

    万次阅读 多人点赞 2019-01-17 15:43:06
    c++文件操作大全 基于C的文件操作  在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。 一、流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义...
  • 文件操作系列函数详解

    千次阅读 2016-05-17 16:00:22
    个人最文件操作做了如下的总结:方法一:用fopen打开,然后用文件那一类操作函数(fopen,fclose,fsacnf,fprintf,fseek,fread,fwirte,fgets)来改变其中的值,个人使用这些函数不太习惯。方法二:把文件映射到内存上...
  • 创建硬链接的函数: 相关函数:symlink, unlink 头文件:#include &...函数说明:link函数中oldpath指定已经存在文件,newpath指定的名称建立一个新的连接(硬链接),若是newpath指定的文件已存在则不会...
  • Fatfs文件系所有函数总结

    万次阅读 多人点赞 2018-04-06 21:47:43
    Fatfs文件系统常用函数:f_mount、f_open、f_close、f_read、f_write、f_lseek、f_truncate、f_sync、f_opendir FatFS是一个为小型嵌入式系统设计的通用FAT(File Allocation Table)文件系统模块。FatFs 的编写遵循...
  • C语言 文件操作的头文件

    千次阅读 2020-01-06 09:31:27
    C语言 文件操作的头文件 计算机文件是以计算机硬盘为载体存储在计算机上的信息集合,是存储在某种长期储存设备上的一段数据流。在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针...
  • C语言字符串常用操作函数C语言字符串、文件操作常用操作函数标准输入/输出重定向文件操作补充 C语言字符串、文件操作常用操作函数 字符串输出 - puts int puts(const char *str) 字符串写入到标准输出 stdout 字符...
  • fatfs文件系统详解之f_write函数分析

    千次阅读 2020-05-31 18:36:43
    本篇分析f_write()函数,fatfs文件系统对应的不知道文件的读写,也对应了文件的其他的操作,也有文件夹的操作函数分析确实是一个非常耗时耗精力的事情,此函数分析完之后,就结束函数分析。 分析假设 (1)假设一...
  • Python文件操作(I/O):相关函数

    千次阅读 2021-02-22 07:39:48
    关于文件的路径和相关函数Python文件操作(I/O):相关函数一.read()函数UnicodeDecodeError异常二.readline()和readlines()函数readline()函数readlines()函数三.for循环读取文件四.write()和writelines()函数write...
  • C++文件操作函数详解

    万次阅读 2012-02-19 10:33:08
    (1) ofstream:写操作,输出文件类; (2) ifstream:读操作,输入文件类; (3) fstream:可同时读写的文件类。 1. open函数:打开文件 函数原型:void open(const char*filename,int mode,int access)...
  • 以前一直都是用fopen、fwrite等高级函数文件,这次尝试用open、write、close操作文件。代码如下: int ret = OB_SUCCESS; int fd = open(config_file, O_WRONLY | O_CREAT | O_TRUNC, S_IRWXU | S_IRWXG...
  • 文件操作函数全集 Linux C

    千次阅读 2007-10-20 08:57:00
    clearerr(清除文件流的错误旗标) 相关函数 feof
  • matlab中的脚本文件函数文件

    千次阅读 2019-09-17 13:43:37
    M文件可分为脚本文件(MATLAB scripts)和函数文件(MATLAB functions)。脚本文件是包含多条MATLAB命令的文件函数文件可以包含输入变量,并把结果传送给输出变量。 两者的简要区别如下: 脚本文件 1.多条命令的...
  • C语言文件读写函数总结

    万次阅读 多人点赞 2018-04-30 23:51:59
    1、字符写入文件函数 fputc 2、从文件中读取字符 fgetc 二、字符串的读写 1、字符串写入文件函数 fputs 2、从文件中读取字符 fgets 三、块数据读写 1、向文件中写入块数据fwrite 2、从文件中读取块数据fread ...
  • MATLAB—M函数文件

    万次阅读 多人点赞 2020-04-19 13:38:22
    首先,要了解脚本文件函数文件的区别,在MATLAB中编写的程序文件称为M文件,M文件分为脚本文件函数文件俩种。 1.脚本文件函数文件的区别 脚本文件:没有输入参数和输出参数,运行脚本文件实际上就是顺序执行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,148,505
精华内容 859,402
关键字:

文件操作函数

友情链接: Lingo.zip