• C++文件操作


    基于C的文件操作 ,在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作 

    一、流式文件操作

    #include <stdlib.h>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        FILE* fp; //创建文件指针
        errno_t err = fopen_s(&fp, "ss.txt", "w+"); //fopen_s打开文件成功返回0,失败返回非0的错误代码
        /*
        参数1:fp 文件指针
        参数2:要读写的文件
        参数3:模式
            r    以只读方式打开文件,该文件必须存在。
            r+    以可读写方式打开文件,该文件必须存在。
            rb+    读写打开一个二进制文件,允许读数据。
            rt+    读写打开一个文本文件,允许读和写。
            w    打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
            w+    打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
            a    以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到
            文件尾,即文件原先的内容会被保留。(EOF符保留) a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加
            到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留) wb 只写打开或新建一个二进制文件;只允许写数据。 wb+ 读写打开或建立一个二进制文件,允许读和写。 wt+ 读写打开或着建立一个文本文件;允许读写。 at+ 读写打开一个文本文件,允许读或在文本末追加数据 ab+ 读写打开一个二进制文件,允许读或在文件末追加数据
    */ int a= fputc('X', fp);//向流写一个字符 //成功返回这个字符的ASCII吗,失败返回EOF int b = fseek(fp,0, SEEK_SET);//定位读写指针 /* 参数1:文件指针 参数2:偏移量--字符数 参数3:移动的基准 SEEK_SET 0 文件开头    SEEK_CUR 1 当前读写的位置    SEEK_END 2 文件尾部 返回值:成功返回0 */ rewind(fp); //把读写指针移到文件头 int c=fgetc(fp);//从流中读一个字符 /* 返回值:成功返回这个字符,失败返回EOF */ int e = fclose(fp);//关闭文件 //如果成功,返回0,失败返回EOF cout << c << endl; }
    FILE* fp; 
        errno_t err = fopen_s(&fp, "ss.txt", "w+"); 
        char aa[] = "liming";
        int a=fputs(aa,fp);  //写一个字符串到流中
        //返回值:函数返回一个非负值,如果发生错误则返回 EOF
        rewind(fp); 
    
        char bb[10];
        char* c= fgets(bb,6,fp);  //从流中读一行或指定个字符
        /*
        参数1:用来保存数据的字符串
        参数2:最多读取n-1个字符,如果读取了一行(不包括行尾的'/n')
        参数3:文件指针
        返回值:如果成功则返回参数1的指针,否则返回NULL
        */
            
        int e = fclose(fp);
        
            cout << c << endl;
    int a= fprintf(fp, "%s","Hahaha"); //按格式输入到流
        //其用法和printf()相同
    char ss[10];
        
        //int b=fscanf_s(fp, "%s", ss, 8); //按格式从流中读取
        /*
        参数4:最多读取的字符数(注意:这个最多读取的字符数的大小是包括的末尾的('')NULL的)
        所以实际上最多可以读取的字符只有8-1=7个字符,
        由于参数3 %s 是读取一个单词,所以如果文件中能够读取的字符串长度
       大于9,那么fscanf_s不会向ss数组中读入任何内容,只将数组第一个元素赋值为'' 注意:单词间隔符:遇到空格、换行符才结束
    */ //与上面不同的是,我们在格式控制符%s这个加了一个宽度控制,意思是最多读取5个字符 int b = fscanf_s(fp, "%5s", ss, 8); //注意:参数4不要小于5 //此时最多读取5个字符,读写指针就在读取到的位置 cout << ss << endl; b = fscanf_s(fp, "%5s", ss, 8); cout << ss << endl; b = fscanf_s(fp, "%5s", ss, 8); cout << ss << endl;
    int b = feof(fp);//检测是否已到文件尾,是返回真,否则返回0
    #include <stdlib.h>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        FILE* fp; 
        errno_t err = fopen_s(&fp, "ss.txt", "w+"); 
        int a[] = { 10,20,30,40,50,60,70,80 };
        int len = sizeof(a) / sizeof(a[0]);
        unsigned long num = fwrite(a, sizeof(a[0]), len, fp);//向流steam写数据 
            /*
            参数1:要写入的数组指针
            参数2:要被写入的每个元素的大小,以字节为单位-unsigned long
            参数3:元素的个数-unsigned long
            参数4:文件指针
            返回值:失败返回-1;成功返回写入的数据个数;
            */
            printf("写了%d个数据
    ", num);
            
        int b[8];
        rewind(fp);
        num = fread(b, sizeof(int), 8, fp);//读取数据 
        /*
        参数1:用来保存数据的char*;注意大小要大于等于读取的字节数
        参数2:要读取的每个元素的大小,以字节为单位
        参数3:元素的个数
         参数4:文件指针
         返回值:失败返回-1;成功返回读取的数据个数
        */
    
        for (int i = 0; i < 8; i++) {
            printf("b[%d]=%d
    ", i, b[i]);
        }
        printf("读了%d个数据
    ", num);
    
    
    
    
        int n = fclose(fp);
        
    
    }

    二、直接I/O文件操作 

    这是C提供的另一种文件操作,它是通过直接存/取文件来完成对文件的处理,而上篇所说流式文件操作是通过缓冲区来进行;流式文件操作是围绕一个FILE指针来进行,而此类文件操作是围绕一个文件的"句柄"来进行,什么是句柄呢?它是一个整数,是系统用来标识一个文件(在WINDOWS中,句柄的概念扩展到所有设备资源的标识)的唯一的记号

    【VS2017好像修改了,没有找到详细教程】

  • 相关阅读:
    Bottle python
    mongodb python pymongo
    Directory常用
    File类常用
    Path类的常用方法
    winfrom的单例模式
    325工厂模式和面向对象知识点总结(有点乱凑合看)
    音乐播放器自动播放下一首歌记录
    c#分页类(转)
    c# 简历生成器
  • 原文地址:https://www.cnblogs.com/liming19680104/p/13495752.html
Copyright © 2020-2023  润新知