• c文件读写


    C 程序员如何创建、打开、关闭文本文件或二进制文件。一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节。C 语言不仅提供了访问顶层的函数,也提供了底层(OS)调用来处理存储设备上的文件。本章将讲解文件管理的重要调用。

    frist step:

    您可以使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FILE包含了所有用来控制流的必要的信息。下面是这个函数调用的原型:

    FILE *fopen( const char * filename, const char * mode );

    在这里,filename 是字符串,用来命名文件,访问模式 mode 的值可以是下列值中的一个:

    模式描述
    r 打开一个已有的文本文件,允许读取文件。
    w 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。
    a 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。
    r+ 打开一个文本文件,允许读写文件。
    w+ 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
    a+ 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。

    如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:

    "rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

    下面是把字符写入到流中的最简单的函数:

    int fputc( int c, FILE *fp );

    函数 fputc() 把参数 c 的字符值写入到 fp 所指向的输出流中。如果写入成功,它会返回写入的字符,如果发生错误,则会返回EOF。您可以使用下面的函数来把一个以 null 结尾的字符串写入到流中:

    int fputs( const char *s, FILE *fp );

    example:

    #include<stdio.h>
    void _testfile();
    int main(){
        _testfile();
        return 0;
    }
    void _testfile(){
      FILE *file = NULL;
     
       file = fopen("files/test.txt", "a+");
       fprintf(file, "This is testing for fprintf...
    ");
       fputs("This is testing for fputs...
    ", file);
       fclose(file);
    }

    注意: 路径前不要加斜杠。否则写不成功

    second step:

    下面是从文件读取单个字符的最简单的函数:

    int fgetc( FILE * fp );

    fgetc() 函数从 fp 所指向的输入文件中读取一个字符。返回值是读取的字符,如果发生错误则返回 EOF。下面的函数允许您从流中读取一个字符串:

    char *fgets( char *buf, int n, FILE *fp );

    函数 fgets() 从 fp 所指向的输入流中读取 n - 1 个字符。它会把读取的字符串复制到缓冲区 buf,并在最后追加一个 null 字符来终止字符串。

    如果这个函数在读取最后一个字符之前就遇到一个换行符 ' ' 或文件的末尾 EOF,则只会返回读取到的字符,包括换行符。您也可以使用 int fscanf(FILE *fp, const char *format, ...) 函数来从文件中读取字符串,但是在遇到第一个空格字符时,它会停止读取。

    #include<stdio.h>
    void _testfile();
    void _testreadfile();
    int main(){
        _testfile();
        _testreadfile();
        return 0;
    }
    void _testreadfile(){
        FILE *file = NULL;
        file = fopen("files/test.txt", "r+");
        char buffer[255];
        fscanf(file,"%s",buffer);
        printf("fscanf:%s
    ",buffer);
        fgets(buffer,255,file);
        printf("fgets1:%s
    ",buffer);
        fgets(buffer,255,file);
        printf("fgets2:%s
    ",buffer);
    
        fclose(file);
    }
    void _testfile(){
        FILE *file = NULL;
    
        file = fopen("files/test.txt", "w+");
        fprintf(file, "This is testing for fprintf...
    ");
        fputs("This is testing for fputs...
    ", file);
        fclose(file);
    }

    当上面的代码被编译和执行时,它会读取上一部分创建的文件,产生下列结果:

    1 : This
    2: is testing for fprintf...
    
    3: This is testing for fputs...

    首先,fscanf() 方法只读取了 This,因为它在后边遇到了一个空格。其次,调用 fgets() 读取剩余的部分,直到行尾。最后,调用 fgets() 完整地读取第二行。

    Thirdly step:

    fseek 可以移动文件指针到指定位置读,或插入写:

    int fseek(FILE *stream, long offset, int whence);

    fseek 设置当前读写点到 offset 处, whence 可以是 SEEK_SET,SEEK_CUR,SEEK_END 这些值决定是从文件头、当前点和文件尾计算偏移量 offset。

    你可以定义一个文件指针 FILE *fp,当你打开一个文件时,文件指针指向开头,你要指到多少个字节,只要控制偏移量就好,例如, 相对当前位置往后移动一个字节:fseek(fp,1,SEEK_CUR); 中间的值就是偏移量。 如果你要往前移动一个字节,直接改为负值就可以:fseek(fp,-1,SEEK_CUR)。

    执行以下实例前,确保当前目录下 test.txt 文件已创建:

    #include<stdio.h>
    void _testseek();
    int main(){
        _testseek();
        return 0;
    }
    
    void _testseek(){
        FILE *file=NULL;
        file=fopen("files/testseek.txt","r+");
        fprintf(file,"This is testing seek");
        fseek(file,1,SEEK_SET);
        if(fputc(65,file)==EOF){
            printf("fputc is fail");
        }
        fseek(file,0,SEEK_SET);
        char buffer[255];
        fgets(buffer,255,file);
        printf("%s",buffer);
        fclose(file);
    }

    输出结果:

    TAis is testing seek

     Fourth step:

    下面两个函数用于二进制输入和输出:

    size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
    size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);

    这两个函数都是用于存储块的读写 - 通常是数组或结构体。

    #include<stdio.h>
    #include<stdlib.h>
    #define MAXLEN 1024
    void _testbinary();
    int main(){
        _testbinary();
        return 0;    
    }
    void _testbinary(){
        FILE *outfile,*infile;
        outfile=fopen("files/testbinary.txt","wb");
        infile=fopen("files/testseek.txt","rb");
        unsigned char buffer[MAXLEN];
        int rc;
        while((rc=fread(buffer,sizeof(unsigned char),MAXLEN,infile))!=0){
            fwrite(buffer,sizeof(unsigned char),rc,outfile);
    
        }
        fclose(infile);
        fclose(outfile);
    
    }
  • 相关阅读:
    【洛谷P2660烤鸡】
    cogs448
    排队打水
    洛谷U36590搬书
    NOIP2012借教室
    归并排序模版
    NOIP2015神奇的幻方
    NOIP2006能量项链
    NOIP2003加分二叉树
    NOI1995石子合并&多种石子合并
  • 原文地址:https://www.cnblogs.com/blueberry006/p/7808534.html
Copyright © 2020-2023  润新知