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;
	}

}

  

•功能:
–从输入流中读入字符,存到string变量
–直到出现以下情况为止:
•读入了文件结束标志
•读到一个新行
•达到字符串的最大长度
–如果getline没有读入字符,将返回false,可用于判断文件是否结束
 
 
#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;//会自动覆盖原来的内容


}

  

posted @ 2017-04-10 16:08  zqlucky  阅读(4222)  评论(0编辑  收藏  举报