逐行读取文件

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"); 

这两种标准方法是:

  1. 假设每行都包含两个数字,并通过令牌读取令牌:

     int a, b; while (infile >> a >> b) { // process pair (a,b) } 
  2. 基于行的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); }