getline及读文件总结
今天由华为软件精英挑战赛的要求,读文件这块自己进行了总结,主要是泛型以及关联容器这块需要加强,现在总结了读文件的iterator的用法。
1、iterator inserter(essential C++ P93)
不需要限定容器的大小就进行插入:使用inserter adapter,这些adapter可以避免容器的assignment操作。
*back_inserter()会以容器的push_back()函数取代assignment运算符;
vector<int> vec;
vector<int> ivec{1,2,3,4};
copy(ivec.begin(),ivec.end(),back_inserter(vec));
*inserter()会以容器的push_front()函数取代assgnment运算符。这个inserter()接受两个参数;一个是容器,另一个是iterator,它指向容器内需要插入的位置。
vector<int> vec; copy(vec.begin(),vec.end(),inserter(vec,vec.end())
*front_inserter()会以容器的push_back()函数取代assignment运算符。但是这个inserter只适合于list和deque。
记住上面的adapter不能用于array。
2、使用iostream iterator;
标准库定义有供输入和输出用的iostream iterator类,称为istream_iterator和ostream_iterator,支持单一类型的读取和写入,它们包含在《iterator》中,其中first表示为
istream_iterator<string> is(filename);
last定义为
istream_iterator<string> eof;
然后使用泛型算法copy(),将文件读取到vector<string> vec中
copy(is,eof,back_inserter(vec));
*******
如果要在两个字符之间插入符号,比如空格,可以使用如下的形式:
copy(is,eof,back_inserter(vec)); ostream_iterato<string> os(output_filename," "); copy(vec.begin(),vec.end(),os);
getline(istream &in, string &s)
从输入流读入一行到string s
**读取一个文件(多行)存储到一个二维数组里面
void readFiletoVec() {
vector<vector<string>> vecFile;
ifstream in("input.txt");
vector<string> tmp,outVec;
ostream_iterator<string> outIter(cout, " ");
string s,tmpS;
while (getline(in, s)) {//读取每一行
istringstream ss(s);
while(ss >> tmpS)//每次读取,空格作为每次读取结束的标志
tmp.push_back(tmpS);
vecFile.push_back(tmp);
vector<string>().swap(tmp);//清空
}
for each(outVec in vecFile) {
copy(outVec.begin(),outVec.end(),outIter);
cout << endl;
}
}
#include<iostream>
#include<sstream>
#include<fstream>
#include<string>
using namespace std;
int Count = 0;
void IntSolve(int n) {
if (n == 1)
++Count;
for (int i = 2; i <= n;++i) {
if (n%i == 0)
IntSolve(n / i);
}
}
int main() {
int n=0;
string s = "input.txt";//需要放在文件的project目录下
string sout = "output.txt";//自动创建文件
ifstream file;
ofstream output(sout);
file.open(s);
file >> n;
file.close();
IntSolve(n);
output << Count;//会自动覆盖原来的内容
}

浙公网安备 33010602011771号