逐行读取文件
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)
}
基于行的解析,使用字符串流:
#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),因为基于标记的解析不会吞噬换行符,所以如果在基于标记的提取之后使用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;
,但是o
在ofstream
代表output
。 如果你想从文件(输入)读取使用ifstream
。 如果你想读写使用fstream
。
既然你的坐标属于成对,为什么不为他们写一个结构呢?
struct CoordinatePair
{
int x;
int y;
};
然后你可以为istreams写一个重载的提取操作符:
std::istream& operator>>(std::istream& is, CoordinatePair& coordinates)
{
is >> coordinates.x >> coordinates.y;
return is;
}
然后你可以直接读入一个坐标文件,像这样:
#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 readingn";
}
// Now you can work with the contents of v
}
链接地址: http://www.djcxy.com/p/66237.html