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

来源:互联网 发布:数据流程图的分析方法 编辑:程序博客网 时间:2024/06/05 12:41

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

向文件中写入数据

首先我们在 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);}

运行结果:

原创粉丝点击