Search code examples
c++charfstreamend-of-line

c++ ifstream end of line


I have a file that looks like this:

e r g d g d
f h d r h f
..........

And I want to store these characters in a two-dimensional array

#include <fstream>
#include <iostream>
using namespace std;
int main()
{
    ifstream file("file.txt");
    char c[20][20];
    int i = 0, j = 0;
    while(!file.eof())
    {
        while(!end of line?)
        {
            file >> c[i][j];
            j++;
        }
        i++;
    }
.....
}        

how do i do this?
or how to find number of characters in a line?


Solution

  • You can't use eof() like you do. You have to perform an I/O read operation before you can then use eof().

    For what you are attempting, you should use std::getline() instead, eg:

    #include <iostream>
    #include <string>
    #include <sstream>
    #include <fstream>
    #include <algorithm>
    
    int main()
    {
        std::ifstream file("file.txt");
        std::string line;
        char c[20][20] = {};
    
        for (int i = 0; i < 20; ++i)
        {
            if (!std::getline(file, line))
                break;
    
            std::istringstream iss(line);
            for(j = 0; j < 20; ++j)
            {
                if (!(iss >> c[i][j]))
                    break;
            }
        }
    
        ...
    
        return 0;
    }
    

    That being said, you should consider using std::vector instead of fixed-sized arrays (unless you know for a fact that your file will never exceed 20 lines and/or 20 characters per line):

    #include <iostream>
    #include <string>
    #include <sstream>
    #include <fstream>
    #include <iterator>
    #include <algorithm>
    #include <vector>
    
    int main()
    {
        std::ifstream file("file.txt");
        std::vector<std::vector<char> > c;
        std::string line;
    
        while (std::getline(file, line))
        {
            std::istringstream iss(line);
            std::vector<char> tmp;
    
            std::copy(
                std::istream_iterator<char>(iss),
                std::istream_iterator<char>(),
                std::back_inserter(tmp)
            );
    
            /* which is equivalent to:
            char ch;
            while (iss >> ch) {
                tmp.push_back(ch);
            }
            */
    
            c.push_back(tmp);
        }
    
        ...
    
        return 0;
    }
    

    Alternatively:

    #include <iostream>
    #include <string>
    #include <sstream>
    #include <fstream>
    #include <iterator>
    #include <algorithm>
    #include <vector>
    
    typedef std::vector<char> CharVector;
    
    std::istream& operator>>(std::istream &in, CharVector &out)
    {
        out.clear();
    
        std::string line;
        if (std::getline(in, line))
        {
            std::istringstream iss(line);
    
            std::copy(
                std::istream_iterator<char>(iss),
                std::istream_iterator<char>(),
                std::back_inserter(out)
            );
    
            /* which is equivalent to:
            char ch;
            while (iss >> ch) {
                out.push_back(ch);
            }
            */
        }
    
        return in;
    }
    
    int main()
    {
        std::ifstream file("file.txt");
        std::vector<CharVector> c;
    
        std::copy(
            std::istream_iterator<CharVector>(file),
            std::istream_iterator<CharVector>(),
            std::back_inserter(c)
        );
    
        /* which is equivalent to:
        CharVector cv;
        while (file >> cv) {
            c.push_back(cv);
        }
        */
    
        ...
    
        return 0;
    }