How to get the line number from a file in C++?

后端 未结 4 1501
借酒劲吻你
借酒劲吻你 2021-02-02 01:15

What would be the best way to get the line number of the current line in a file that I have opened with a ifstream? So I am reading in the data and I need to store

4条回答
  •  半阙折子戏
    2021-02-02 01:46

    An inefficient but dead simple way is to have a function that given a stream, it counts the new line characters from the beginning of the stream to the current position.

    int getCurrentLine(std::istream& is)
    {
        int lineCount = 1;
        is.clear();     // need to clear error bits otherwise tellg returns -1.
        auto originalPos = is.tellg();
        if (originalPos < 0) 
            return -1;
        is.seekg(0);
        char c;
        while ((is.tellg() < originalPos) && is.get(c))
        {
            if (c == '\n') ++lineCount;
        }
        return lineCount;
    }
    

    In some code I am working on, I am only interested to know the line number if invalid input is encountered, in which case import is aborted immediately. Since the function is called only once the inefficiency is not really a problem.

    The following is a full example:

    #include 
    #include 
    
    
    int getCurrentLine(std::istream& is)
    {
        int lineCount = 1;
        is.clear();     // need to clear error bits otherwise tellg returns -1.
        auto originalPos = is.tellg();
        if (originalPos < 0) 
            return -1;
        is.seekg(0);
        char c;
        while ((is.tellg() < originalPos) && is.get(c))
        {
            if (c == '\n') ++lineCount;
        }
        return lineCount;
    }
    
    void ReadDataFromStream(std::istream& s)
    {
        double x, y, z;
        while (!s.fail() && !s.eof())
        {
            s >> x >> y >> z;
            if (!s.fail())
                std::cout << x << "," << y << "," << z << "\n";
        }
    
        if (s.fail())
            std::cout << "Error at line: " << getCurrentLine(s) << "\n";
        else
            std::cout << "Read until line: " << getCurrentLine(s) << "\n";
    }
    
    int main(int argc, char* argv[])
    {
        std::stringstream s;
        s << "0.0 0.0 0.0\n";
        s << "1.0 ??? 0.0\n";
        s << "0.0 1.0 0.0\n";
        ReadDataFromStream(s);
    
        std::stringstream s2;
        s2 << "0.0 0.0 0.0\n";
        s2 << "1.0 0.0 0.0\n";
        s2 << "0.0 1.0 0.0";
        ReadDataFromStream(s2);
    
        return 0;
    }
    

提交回复
热议问题