现在的位置: 首页 > 综合 > 正文

读取文本数据

2016年06月24日 ⁄ 综合 ⁄ 共 1852字 ⁄ 字号 评论关闭

输入文件:

1 2 3  
4 5 6

输出到vector中

代码:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <cassert>
using namespace std;
template<typename DT>
bool checkLineData(istringstream &instr, const int &nCol)
{
	int c = 0;
	DT tpVar;
	while(instr>>tpVar)
	{
		c++;
	}
	instr.clear();
	instr.seekg(istringstream::beg);
	return (c==nCol);
}

template<typename DT>
void dispData(vector<DT> &data, const int &nRow, const int &nCol)
{
	int index = 0;
	int r,c;
	int nColM1 = nCol-1;
	assert((int)(data.size())==(nRow*nCol));

	for (r = 0; r < nRow; r++){
		for (c = 0; c < nColM1; c++){
			cout << data[index] << "\t";
			index++;
		}
		cout << data[index];
		index++;
		cout << endl;
	}
}

template<typename DT>
int readDataFromTXT(vector<DT> &data,int &nRow, int &nCol, const string &filename)
{
	ifstream infile; 
	istringstream instr;
	string line; // the string to store one line.
	DT tpVar;
	int k;
	infile.open(filename.c_str(), ios_base::in);
	if (!infile.is_open())
	{
		cerr << "failed to open the file of " << filename << "." << endl;
		return -1;
	}
	// read the first line and check number of column.
	std::getline(infile, line);
	instr.str(line);
	nCol = 0;
	while(instr >> tpVar) {
		nCol++;
	}
	// read the remaining data and stored into a vector.
	infile.seekg(ifstream::beg);
	nRow = 0;
	while(!infile.eof())
	{
		std::getline(infile, line); // get one line.
		instr.clear(); // Clears the stream error state flags by assigning them the value of state.
		instr.str(line); // ready to read the data.
		if (checkLineData<DT>(instr, nCol))
		{
			for (k = 0; k < nCol; k++)
			{
				instr >> tpVar;
				data.push_back(tpVar);
			}
			nRow++;
		}
	}
	infile.close();
	return 0;
}

int main(int argc, char **argv)
{
	if (argc != 2)
	{
		cerr << "[ ERROR ] error using current application." << endl;
		cerr << "[ HELP  ] using it in the following way:" << endl;
		cerr << "[ HELP  ] ./main.exe filename.txt" << endl;
		return -1;
	}
	// inpute
	string filename = string(argv[1]); 

	// output
	vector<double> data;
	int nRow,nCol;

	// processing
	if (0!=readDataFromTXT<double>(data, nRow, nCol, filename))
		return -1;
	
	// displying
	dispData<double>(data, nRow, nCol);
	cout << "number of rows   = " << nRow << endl;
	cout << "number of column = " << nCol << endl;

	return 0;
}

抱歉!评论已关闭.