逐行读取文件

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; ,但是oofstream代表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

    上一篇: Read file line by line

    下一篇: Filling a Partially Rounded Rectangle with GDI+