-2

次のようなファイルがあります。

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

そして、これらの文字を2次元配列に格納したい

#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++;
    }
.....
}        

どうすればいいですか?
または行の文字数を見つける方法は?

4

1 に答える 1

1

あなたeof()のように使うことはできません。を使用する前に、I/O 読み取り操作を実行する必要がありますeof()

あなたが試みていることについては、std::getline()代わりに使用する必要があります。

#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;
}

そうは言っても、std::vector固定サイズの配列の代わりに使用することを検討する必要があります (ファイルが20 行および/または 1 行あたり 20 文字を決して超えないことがわかっている場合を除きます)。

#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;
}

または:

#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;
}
于 2016-11-10T00:14:12.627 に答える