今天由華為軟件精英挑戰賽的要求,讀文件這塊自己進行了總結,主要是泛型以及關聯容器這塊需要加強,現在總結了讀文件的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;//會自動覆蓋原來的內容
}
