首页 > 编程语言 >C++温故补缺(十):C++文件读写和流

C++温故补缺(十):C++文件读写和流

时间:2023-03-20 23:22:07浏览次数:48  
标签:文件 open 读写 ios C++ file fstream include 温故

C++文件和流

C++文件的读写流用的是fstream库,它定义了三个新的数据类型:

数据类型 描述
ofstream 该数据类型表示输出文件流,用于创建文件并向文件写入信息。
ifstream 该数据类型表示输入文件流,用于从文件读取信息。
fstream 该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。

打开文件

从文件读取信息或向文件写入信息之前,必须先打开文件,用到open()函数,open()函数是fstream,ifstream,ofsteam对象的一个成员

open()函数的第一参数是要打开的文件的名称,第二个参数是模式:open(path,mode);

模式标志 描述
ios::app 追加模式。所有写入都追加到文件末尾。
ios::ate 文件打开后定位到文件末尾。
ios::in 打开文件用于读取。
ios::out 打开文件用于写入。
ios::trunc 如果该文件已经存在,则先删除该文件,再重新创建
ios::binary 二进制方式

且可以把多个模式结合起来用,如:

ofstream outfile;
outfile.open("data.dat",ios::out|ios::trunc);

就是以写入模式打开文件,且如果文件已经存在,就把之前的内容截断

关闭文件

虽然程序终止时,会自动关闭刷新所有的流,释放所有分配的内存,并关闭所有打开的文件,但最好还是在程序终止前用close()函数关闭文件

void close();

读写文件流

fstream也有类似cout,cin的流操作,ofstream<<str;一个ofstream对象可以和<<连接使用,将后面的内容写入ofstream对象打开的文件

如:

#include<iostream>
#include<fstream>
using namespace std;
int main(){
    ofstream outfile("data.dat");
    int a=4321;
    outfile<<a<<"test";

}

同样,ifstream对象可以和>>连用,将ifstream对象打开的文件的内容读到变量中。如:

#include<iostream>
#include<fstream>
using namespace std;
int main(){
    ifstream infile("data.dat");
    string str;
    infile>>str;
    cout<<str;

}

逐行和逐个字符读文件

逐个字符
#include<iostream>
#include<fstream>
using namespace std;
int main(){
    fstream file;
    char c;
    file.open("data.dat",ios::in);
    while(!file.eof()){
        file>>c;
        cout<<c;
    }
    file.close();
    cout<<endl;
}

file.eof()是文件对象的成员,当读到文档的结尾时,会返回一个EOF标志,eof()函数当遇到EOF标志时,返回boolean的true

逐行读取

需要用到getline()函数:getline(char* str,int size,char delim);

str:用来接收读文件流的字符串变量

size:字符数

delim:分隔符,一般为'\n'

#include<iostream>
#include<fstream>
using namespace std;
int main(){
    fstream file;
    char buffer[256];
    file.open("data.dat",ios::in);
    while(!file.eof()){
        file.getline(buffer,256,'\n');
        cout<<buffer<<endl;
    }
    file.close();
    cout<<endl;
}

流指针

ifstream 对象有一个get pointer指针,指向下一个被读取的元素

ofstream有一个put pointer指针,指向写入下一个元素的位置

fstream,同时继承了get和put指针

  • 获取流指针的位置

tellg()和tellp(),返回一个整数,表示当前的get和put指针的位置

  • 设置流指针的位置

seekg()和seekp(),他们有两种函数原型:

seekg(pos_type position);只有一个参数时,定义到第position的位置

seekg(off_type offset,seekdir direction)有两个参数时,用偏移量定位,direction是定位的初位置,offset是前后偏移量

参数 含义
ios::beg 从流开始位置计算的位移
ios::cur 从流指针当前位置开始计算的位移
ios::end 从流末尾处开始计算的位移

如:

file.seekg(-10,ios::cur)

就是从当前位置向前移动10个字节

例子:

#include<iostream>
#include<fstream>
using namespace std;
int main(){
    fstream file;
    file.open("data.dat",ios::in|ios::out);
    char buffer[100];
    file<<"Hello,tom";

    file>>buffer;
    file.close();
    cout<<buffer;
}

对文件先写后读,输出:

因为写完指针移动到了末尾,然后读就什么都读不出来,需要移动get指针

#include<iostream>
#include<fstream>
using namespace std;
int main(){
    fstream file;
    file.open("data.dat",ios::in|ios::out);
    char buffer[100];
    file<<"Hello,tom";
    file.seekg(0);
    file>>buffer;
    file.close();
    cout<<buffer;
}

二进制读写

二进制数据的读写用的是write和read函数:

write/read(char* buffer,streamsize size);

如:

#include<iostream>
#include<fstream>
using namespace std;
int main(){
    fstream file;
    file.open("data.dat",ios::in|ios::out|ios::binary);
    char buffer[100];
    file.write("Hello,eva",9);
    file.seekg(0);
    file.read(buffer,9);
    file.close();
    cout<<buffer;
}

标签:文件,open,读写,ios,C++,file,fstream,include,温故
From: https://www.cnblogs.com/Tenerome/p/cppreview10.html

相关文章

  • 面试高频问题之C++11新特性
    背景C++11是C++语言的一个重大更新,引入了许多新特性,包括自动类型推导、lambda表达式、右值引用、智能指针等等。这些新特性使得C++更加现代化、高效、易用。也是面试容很容......
  • 面试高频问题之C++11新特性
    背景C++11是C++语言的一个重大更新,引入了许多新特性,包括自动类型推导、lambda表达式、右值引用、智能指针等等。这些新特性使得C++更加现代化、高效、易用。也是面试容很......
  • [第十届蓝桥杯省赛C++B组]等差数列
    来源:第十届蓝桥杯省赛C++B组算法标签:数论最大公约数题目描述数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中N个整数。现在给......
  • 读写分离
    互联网大部分业务场景都是读多写少的,对于电商等典型业务,读和写的请求对比可能差了不止一个数量级。为了不让数据库的读成为业务瓶颈,同时也为了保证写库的成功率,一般会采用......
  • 以下是一个使用C++实现HTTP文件下载的简单示例,其中使用了C++ 11的标准库和Boost库:
    #include<iostream>#include<fstream>#include<boost/asio.hpp>usingboost::asio::ip::tcp;intmain(){try{boost::asio::io_serviceio_service;......
  • c++环境
    目录环境准备下装安装vscode及插件安装mingw编译器工作环境准备vscode工作目录调试环境CSDN参考文档环境准备下装安装vscode及插件vscode是微软账号登录的插件配置信息......
  • [C++引用] 保定丽丽带你学C++
    引用是C++内一个比较有用的方法,大家在丽丽的带领下好好学习。一.引用的基本使用C++引用的作用:给变量起别名语法:​​数据类型&名字=原名​​示例:#include<iostream>usi......
  • ShardingSphere5.0.0-Sharding-proxy MySql 读写分离
    一、关于ShardingSphere 官网:​​ApacheShardingSphere​​官方文档:​​概览::ShardingSphere​​官方下载:​​Indexof/dist/shardingsphere​​本文使用版本:apache-sh......
  • ShardingSphere5.0.0-Sharding-proxy MySql 读写分离
    一、关于ShardingSphere 官网:ApacheShardingSphere官方文档:概览::ShardingSphere官方下载:Indexof/dist/shardingsphere本文使用版本:apache-shardingsphere-5.0.0......
  • C++重载
    返回值不能作为重载的依据intfun()const;intfun();常成员函数可以用于重载无法重载的情况voidfun(inta);voidfun(constinta);普通值传递和const传递无法......