今天由华为软件精英挑战赛的要求,读文件这块自己进行了总结,主要是泛型以及关联容器这块需要加强,现在总结了读文件的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;//会自动覆盖原来的内容 }