C++抽象编程——数据文件的读写与修改

这部分内容我在文件的介绍系列是没有提到的,我当时只是提到了怎么把打开一个文件,怎么再已有数据的文件里处理。其实我们怎么在文件中写入跟读取数据也是很重要的。

向文件中写入数据

首先我们在 f 盘建一个名为 my.txt 的空文件。在向文件写入数据的时候我们要声明一个输出文件流对象 。就像这样:

ofstream outfile;

声明了一个输出流的文件对象,名为outfile。我们可以利用其所在的头文件重载的 << 运算符直接对文件输出。举个例子:

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main(){
    string str,str2;
    getline(cin,str);
    vector<int> vec;
    ofstream outfile;
    outfile.open("F:\\my.txt"); //打开文件 
    if (outfile.fail()){
        outfile.clear();
        cout << "打开文件失败" << endl;
    }
    outfile << str << endl; //输出完数据之后换行 
    for(int i = 0; i < 10; i++){
        vec.push_back(i);
        outfile << vec[i] << " "; //向文件写入一个vector的数据0-9 
    }
    outfile.close();
    return 0;
}

这种方式是按行输入的。运行结果:

在文件的末尾接着写入

但是,显然一个文件之所以有价值,是因为我们能对其接着操作而不删除其原来的值。如果我们上面的文件,在我们关闭后,我们再想在其文件的末尾继续添加数据。我们再次按照上面的方法写入,那么我们之后写入的数据就会覆盖前面的内容,这显然不是我们想要的结果。C++为我们提供了各种打开文件的方法,它把写入的位置定在特定的位置,主要有下表:

打开方式作用
ios::in以输入的方式打开文件
ios::out以输出方式打开文件(默认打开方式)
ios::app以输入方式打开文件,写入的文件添加到文件末尾
ios::binary以二进制方式打开一个文件,不指定这个方式则默认为ASCII方式

除了这些方式,C++允许我们使用 “|”运算符来对这些操作进行组合(当然不能冲突)。例如:

ios::in|ios::out  //打开的文件可以读也可以写
ios::out|ios::app  //以输出方式打开文件,然后我们在末尾写入数据

其实文件流还提供了 seekp(文件中的位置),这样的打开方式,但是我觉得我们会了组合,比这个方便很多。
现在我们来继续提出的问题,我们在上一个文件后面写入数据:

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main(){
    string str,str2;
    getline(cin,str);
    ofstream outfile;
    outfile.open("F:\\my.txt",ios::out|ios::app); //打开文件,定位在文件的末尾 
    if (outfile.fail()){
        outfile.clear();
        cout << "打开文件失败" << endl;
    }
    outfile << str;
    outfile.close();
    return 0;
}


当然 我们可以按行输入,这样我们只要先写入一个换行,再写入数据就好了,结果就像下面的图:

PS:显然我们可以把outfile对象当做我们熟悉的cout来处理,只不过这个时候它面对的是文件而不是控制台而已

从文件读入数据并进行相关的处理

既然我们可以写入数据,那么当然我们可以读入数据再处理。来一段实例:

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
bool isOdd(int a);
int main(){
    ifstream infile;
    vector<int> vec(10);
    vector<int>::iterator it,it2; 
    infile.open("F:\\my.txt",ios::out|ios::in); //打开文件,定位在文件的末尾 
    if (infile.fail()){
        infile.clear();
        cout << "打开文件失败" << endl;
    }
    cout << "读入的数据为:" << endl;
    for(int i = 0; i < 10; i++){
        infile >> vec[i];
        cout << vec[i] << " ";
    }//此时,我们已经把文件写入到我们的控制台
    cout << endl;
    //然后我们可以对它进行正常的vector处理 
    cout << "执行移除奇数的操作:" << endl;
    it = remove_if(vec.begin(),vec.end(),isOdd);
     for(it2 = vec.begin(); it2 != it; it2++){
        cout << *it2 << " ";
    }
    infile.close();
    return 0;
}
bool isOdd(int a) {
    return (a % 2 == 1);
}

运行结果:

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值