C++文件流。
首先需要包含头文件#include< fstream >
fstream可以把它理解成一个父类,包含的子类有ifstream和ofstream等,
fstream:文件输入输出类。表示文件级输入输出流(字节流);
ifstream:文件输入类。表示从文件内容输入,也就是读文件;
ofstream:文件输出类。表示文件输出流,即文件写。
所以一般直接创建一个父类对象即可(即fstream类的对象)

C++中seep()和seekg()函数功能
seekg:设置输入文件流的文件流指针位置
seekp:设置输出文件流的文件流指针位置

C++文件流检测EOF
成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。原型是inteof();
例:if(in.eof())ShowMessage("已经到达文件尾!");
C++文件流文件定位
和C的文件操作方式不同的是,C++ I/O系统管理两个与一个文件相联系的指针。一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它下次写操作的位置。每次执行输入或输出时,相应的指针自动变化。所以,C++的文件定位分为读位置和写位置的定位,对应的成员函数是 seekg()和 seekp(),seekg()是设置读位置,seekp是设置写位置。它们最通用的形式如下:
1.  istream &seekg(streamoff offset,seek_dir origin);  
2.  ostream &seekp(streamoff offset,seek_dir origin);

函数原型:
ostream& seekp( streampos pos );
ostream& seekp( streamoff off, ios::seek_dir dir );
istream& seekg( streampos pos );
istream& seekg( streamoff off, ios::seek_dir dir );
函数参数
pos:新的文件流指针位置值
off:需要偏移的值
dir:搜索的起始位置
dir参数用于对文件流指针的定位操作上,代表搜索的起始位置

seekg(绝对位置);      //绝对移动,    //输入流操作  
seekg(相对位置,参照位置);  //相对操作  
tellg();          //返回当前指针位置  
seekp(绝对位置);      //绝对移动,    //输出流操作  
seekp(相对位置,参照位置);  //相对操作     
tellp();          //返回当前指针位置

在ios中定义的枚举类型:
enum seek_dir {beg, cur, end};
每个枚举常量的含义:
ios::beg:文件流的起始位置
ios::cur:文件流的当前位置
ios::end:文件流的结束位置
这两个函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。
例:
1.  file1.seekg(1234,ios::cur);//把文件的读指针从当前位置向后移1234个字节  
2.  file2.seekp(1234,ios::beg);//把文件的写指针从文件开头向后移1234个字节

下边的代码讲解了
1:4种文件的读写操作
2:如何使用get(),put(),getline(),write()以及read()函数。
3:如何得到文件的大小。
4:seekg()和teelg()配套使用的真谛,seekp()和teelp()同理

//文件流;
#include<iostream>
#include<fstream>  //ifstream  ofstream
using namespace std;
/*
    No1.文件流流类
    ofstream:打开文件,写文件
    ifstream:打开文件,读操作
    fstream:可读可写
    No2.一般用包含#include<fstream>
    No3.打开文件,关闭文件
    打开文件:
    void open(const char* URL,ios::openmode mode);
    mode: 
        ios:in  读的方式打开文件
        ios:out 写的方式打开文件
        ios::app 追加的方式写文件
        ios::ate  在已有的文件,文件指针在文件末尾
        ios::trunc  文件不存在,创建文件
        ios::binary  二进制形式打开文件,默认方式ASCII码方式打开
        ios::nocreate  不创建的方式
        ios::norepalce  不替换
    组合方式:用的是位或
        ios::in|ios::out 可读写
        ios::out|ios::binary 二进制写的方式打开文件,
    判断文件是否打开成功:
        1.is_open() 判断打开是否成功
        2.!文件对象  判断文件是否打开成佛那个
    关闭文件:close()成员函数关闭;
    */
void testOpenFile() {    //用于测试用的函数
    //C++中打开文件是文件对象,不是文件指针。

fstream File,File1;
    File.open("2.txt", ios::in | ios::out );
    File1.open("3.txt", ios::in | ios::out | ios::trunc);
    //使用open函数和直接用构造函数是一样的效果。
    if (!File.is_open()) {
        cerr << "2.txt 打开文件失败!!\n";
    }
    if (!File) {
        cerr << "2.txt打开文件失败!!!\n";
    }//这个if语句和上一个if语句作用相同
    if (!File1.is_open()) {
        cerr << "3.txt打开文件失败!!\n";
    }
    else {
        cout << "3.txt 打开成功!!!\n";
    }
    File.close();
    File1.close();
}
//No2.读写方式:
void asciiReadWriteFile(const char* readFileName, const char* writeFileName) {
    fstream read(readFileName, ios::in);
    fstream write(writeFileName, ios::out);
    //第一种读写方式:ASCII  直接流的方式读写, >>  <<
    /*while (1) {
        char temp;
        read >> temp;
        if (read.eof()) {
            break;
        }
        write << temp;
    }*/
    //第二种方式读写方式:可以保留空格和换行,用get()和put();
    /*while (1) {
        char temp;
        read.get(temp);
        //temp=read.get();一样的效果!
        if (read.eof()) {
            break;
        }
        write.put(temp);
    }*/
    //第三种读写方式:不能保留空格和换行,用getline()和write().
    char str[40]; 
    while (!read.eof()) {
        memset(str, ' ', 40);
        read.getline(str,40);
        int len = strlen(str);
        write.write(str,len);
        write.put('\n');
    }
}
//使用二进制读写方式  使用read()和write()函数来实现
void binaryReadWriteFile(const char* readFile, const char* writeFile) {
    fstream read(readFile, ios::in | ios::binary);
    fstream write(writeFile, ios::out | ios::binary);
    while (!read.eof()) {
        char str[1024]="";
        read.read(str, 1024);
        
        write.write(str, 1024);
    }
    read.close();
    write.close();
}
//
void testSeekReadFile(const char* fileName) {
    fstream fread(fileName, ios::in);
    fstream fwrite(fileName, ios::app|ios::out);
    if (!fread) {
        cerr << "打开文件\"fileName\"!失败!";
    }
    int f = fread.tellg();
    fread.seekg(0,ios::end);
    int l = fread.tellg();
    cout << "size  of  " << fileName << "is "<<(l - f) << "bytes.";
    fread.seekg(5);//表示将指针位置设置到绝对位置5;
    cout << (char)fread.get() << endl;
    fread.seekg(-1, ios::cur);        //seekg的第一个参数为负,表示从当前位置往前移
    cout << (char)fread.get() << endl;
    fread.seekg(1, ios::cur);//第一个参数为正,表示从当前位置往后数的第一个位置。
    
    fwrite.put('w');//在末尾追加写。
}
int main() {
    testOpenFile();
    asciiReadWriteFile("read.txt","write.txt");
    binaryReadWriteFile("read.txt", "binaryTest.txt");
    testSeekReadFile("read.txt");
    return 0;
}

C++文件流fstream详细说明相关推荐

  1. C++文件流fstream相关操作

    C++文件流fstream相关操作 一.理解Open函数 利用fstream,使用open/close打开或创建,完成后关闭,对文件读入读出使用插入器(<<) 或析取器(>>) ...

  2. C++ 流的操作 | 初识IO类、文件流、string流的使用

    文章目录 前言 IO头文件 iostream fstream sstream 流的使用 不能拷贝或对 IO对象 赋值 条件状态与 iostate 类型 输出缓冲区 文件流 fstream类型 文件模式 ...

  3. C++学习22:C++文件流

    总结放前面:最后总结一下:用这个东西,不如用C标准库和linux系统调用,如果不是为了让C++知识饱满一点,真不想研究这东西. 文件流是以磁盘中的文件作为输入.输出对象的数据流.输出文件流将数据从内存 ...

  4. C++ Primer 5th笔记(8)chapter8 类:IO库-文件流

    1.创建一个文件流 ifstream in(ifile);//打开文件 ofstream out;//不打开文件 2. 文件输入输出类继承自iostream类,可以使用iostream类的操作 fst ...

  5. C++ IO类(3) 文件流

    我们可以通过文件流来控制文件的输入以及输出: fstream: 创建一个未绑定的文件流 fstream fstrm("file.txt")  创建一个fstream,并打开名为s的 ...

  6. c++语言文件流,C++ IO类、文件输入输出、string流详细讲解

    新的C++标准中有三分之二的内容都是描述标准库.接下来重点学习其中几种核心库设施,这些是应该熟练掌握的. 标准库的核心是很多容器类(顺序容器和关联容器等)和一簇泛型算法(该类算法通常在顺序容器一定范围 ...

  7. C++文件流:myfstream,fstream,文件读写,随机文件读写【C++文件流】(59)

    文件流 myfstream fstream Test myfstream fstream 流对象的定义 流对象关联文件 open 函数 打开方式 关闭流对象 文件读写 读写文本文件 读写接口 读一字/ ...

  8. c++文件流基本用法(fstream, ifstream, ostream)

    原文链接 前言: c++的文件流处理其实很简单,前提是你能够理解它.文件流本质是利用了一个buffer中间层.有点类似标准输出和标准输入一样. c++ IO的设计保证IO效率,同时又兼顾封装性和易用性 ...

  9. 一文彻底搞懂C++文件流, 文件读写,fstream、seekg、seekp等的使用。

    彻底搞懂C++文件流. 首先需要头文件#include< fstream > fstream可以把它理解成一个父类,包含的子类有ifstream和ofstream等, 所以一般直接创建一个 ...

最新文章

  1. matlab二阶导数表示,【单选题】在MATLAB符号计算中,y的二阶导数表示为( )。...
  2. web网页获取,cookie 的管理,post和get方式的模拟。
  3. 【FTP】java FTPClient 文件上传内容为空,文件大小为0
  4. 【Tools】MarkDown教程(二)-MarkDown基本语法
  5. 如何编写 Nagios 插件 (http://zener.blog.51cto.com/937811/727685)
  6. ElasticSearch教程——自定义分词器(转学习使用)
  7. pythonxlwt行居中_python3-xlwt-Excel设置(字体大小、颜色、对齐方式、换行、合并单元格、边框、背景、下划线、斜体、加粗)...
  8. python实例 81,82
  9. oracle序列修改语句
  10. 【同113】LeetCode 129. Sum Root to Leaf Numbers
  11. HTTP代理原理探索
  12. lnmp一键安装的步骤
  13. 随身系统veket linux v3.11简体中文免费版,《veket随身系统》下载(veket linux)1.9
  14. linux查看ftp默认端口,linux系统如何修改ftp默认端口(图文)
  15. Cloudera Manager server服务器系统损坏后恢复
  16. IOS-启动图和开屏广告图,类似网易
  17. 简述验证Anaconda是否安装成功的两种方式和Anaconda环境变量配置过程
  18. Java程序性能优化-概述
  19. Fast R-CNN 论文详读
  20. 王者荣耀服务器维护公告5月8号,王者荣耀5月8日更新维护公告 5.8更新了什么

热门文章

  1. 手机从图片中提取文字的方法
  2. 5分钟速览证券行业财富管理转型新趋势
  3. IDOC三方销售的退货处理
  4. Linux Command sshpass 远程主机
  5. python创意编码_中学生Python创意编程
  6. 2023年上半年PETS5报名及考试时间正式公布
  7. 关于使用阿里MaxCompute(原ODPS),循环删除所有表下的分区的爬坑辛酸泪
  8. php 网站打包app,利用cordova将网站封装成app
  9. CSS中的BFC是什么
  10. 2套 三级联动