逐行读取文件
file.txt的内容是:
5 3 6 4 7 1 10 5 11 6 12 3 12 4
其中5 3
是坐标对。 如何在C ++中逐行处理这些数据?
我能够得到第一行,但我怎么得到文件的下一行?
ofstream myfile; myfile.open ("text.txt");
首先,做一个ifstream
:
#include <fstream> std::ifstream infile("thefile.txt");
这两种标准方法是:
-
假设每行都包含两个数字,并通过令牌读取令牌:
int a, b; while (infile >> a >> b) { // process pair (a,b) }
-
基于行的parsing,使用stringstream:
#include <sstream> #include <string> std::string line; while (std::getline(infile, line)) { std::istringstream iss(line); int a, b; if (!(iss >> a >> b)) { break; } // error // process pair (a,b) }
你不应该混合使用(1)和(2),因为基于标记的parsing不会吞噬换行符,所以如果在基于标记的提取之后使用getline()
将你带到已经结束了。
使用ifstream
从文件读取数据:
std::ifstream input( "filename.ext" );
如果你真的需要一行一行阅读,那么做到这一点:
for( std::string line; getline( input, line ); ) { ...for each line in input... }
但是你可能只需要提取坐标对:
int x, y; input >> x >> y;
更新:
在你的代码中你使用的是ofstream myfile;
,但是在stream的代表output
。 如果你想从文件(input)读取使用ifstream
。 如果你想读写使用fstream
。
既然你的坐标属于成对,为什么不为他们写一个结构呢?
struct CoordinatePair { int x; int y; };
然后你可以为istreams写一个重载的提取操作符:
std::istream& operator>>(std::istream& is, CoordinatePair& coordinates) { is >> coordinates.x >> coordinates.y; return is; }
然后你可以直接读取一个坐标文件,像这样的vector:
#include <fstream> #include <iterator> #include <vector> int main() { char filename[] = "coordinates.txt"; std::vector<CoordinatePair> v; std::ifstream ifs(filename); if (ifs) { std::copy(std::istream_iterator<CoordinatePair>(ifs), std::istream_iterator<CoordinatePair>(), std::back_inserter(v)); } else { std::cerr << "Couldn't open " << filename << " for reading\n"; } // Now you can work with the contents of v }
扩大接受的答案,如果input是:
1,NYC 2,ABQ ...
你仍然可以应用相同的逻辑,像这样:
#include <fstream> std::ifstream infile("thefile.txt"); if (infile.is_open()) { int number; std::string str; char c; while (infile >> number >> c >> str && c == ',') cout << number << " " << str << "\n"; } infile.close();
用命令行参数:
#include <iostream> #include <fstream> #include <vector> #include <algorithm> #include "print.h" using namespace std; int main (int argc, char *argv[]) { vector<string> list; ifstream in_stream; string line; in_stream.open(argv[1]); while(!in_stream.eof()) { in_stream >> line; list.push_back(line); } in_stream.close(); print(list); sort(list.begin(), list.end()); print(list); }