1. ホーム
  2. c++

[解決済み] クラスstringstream。lineStreamの動作、パラメータが理解できない。

2022-02-07 23:26:38

質問事項

私は以下のコードを持っていて、それがどのように動作し、何をするのか知っています、しかし、全く知りません。この3行がどのように機能するのか理解できません。 std::stringstream lineStream(line); std::stringセル; std::getline(lineStream, cell, ';') 特にlineStreamの方。 googleで検索してみましたが、十分な説明がありません。これらの挙動を説明していただくか、良いリンク先を教えていただけませんか?ありがとうございます、良い一日を:)

    container *begin = new container;
    begin->beginBox = new box;
    container *last = NULL;

    std::ifstream  data(filename);
    std::string line;
    std::getline(data, line);

    for (container *i = begin; !data.eof() && std::getline(data, line);)
    {
        std::stringstream lineStream(line);
        std::string cell;
        std::getline(lineStream, cell, ';');
        i->ID = atoi(cell.c_str());
        for (box *j = i->beginBox; std::getline(lineStream, cell, ';'); j->next = new box, j = j->next)
        {
            j->apples = atoi(cell.c_str());
            i->lastBox = j;
        }

        i->lastBox->next = NULL;
        i->nextCont = new container(), last = i, i = i->nextCont, i->beginBox = new box;
    }
    setAutoIncrement(begin->ID + 1);
    last->nextCont = NULL;
    return begin;

解決方法は?

std::stringstream lineStream(line);

という変数を宣言しています。 lineStream 型の std::stringstream . これは line の文字列を そのコンストラクタ (2) . その std::stringstream 型は、文字列をストリームインターフェースでラップしています。つまり、以下のように扱うことができます。 coutcin を使用しています。 <<>> を使って、文字列から何かを挿入したり取り出したりすることができます。ここでは lineStream が作成され、後でその中身を取り出すには std::getline .

std::string cell;

これは単に空の std::string という cell .

std::getline(lineStream, cell, ';');

機能 std::getline (1) は、最初の引数として、行を抽出するストリームを受け取ります。第二引数は std::string に行を展開する。第3の引数がない場合、行の終わりは改行文字があるところとみなされます。しかし、第3の引数を渡すことで、このコードは行の終わりを ; . つまり、この std::getline を見つけるまで、ストリームからすべてを抽出します。 ; 文字に変換し、その内容を cell . その ; 文字は破棄されます。


これはすべて、上記のコードと非常によく似ています。

std::ifstream  data(filename);
std::string line;
std::getline(data, line);

ここでは、ストリームは文字列ストリームではなく、ファイルストリームであり std::getline は、第3引数が与えられていないため、改行文字までのすべてを抽出します。