0

可変量の入力を受け取るようにプログラムをフォーマットする必要があります。変数とは、入力の行数がわからないことを意味します。入力は次のように渡されます。

cat input | ./myProg

私はこのバージョンのプログラムを作成しましたが、1行の入力を正常に取得し、それをcharバッファーに格納して、コンソールに出力します。

#include <iostream>
#include <fstream>
using namespace std;

int main(void)
{
    char outputData[1024];

    cin.getline(outputData,1024);

    cout << outputData;

    return 0;
}

このプログラムを一般化して、可変数の行を取得し、後で操作できるように1つの大きなcharバッファーに格納するための支援が必要です。次のコードを記述しましたが、コンソールに情報を出力しません。

#include <iostream>
#include <fstream>
using namespace std;

int main(void)
{    
    char outputData[1024];

    while(!cin.eof())
    {
    cin.getline(outputData,1024);
    }

    cout << outputData;

    return 0;
}
4

2 に答える 2

2

文字列とベクトルを使用します。

#include <vector>
#include <string>
#include <iostream>

std::vector<std::string> lines;

for (std::string line; std::getline(std::cin, line); )
{
    v.push_back(std::move(line));
}

誰かが来て istream イテレータとサブクラス化を提案する前にstd::string、あえてコードを減らしてください :-)

于 2013-03-04T09:35:31.973 に答える
2

現在のソリューションでは、ループごとにバッファーの内容をオーバーライドするため、意図したとおりにすべての行が出力されないことは明らかです。

とにかく、std::string可変量の文字を保存する場合は、使用する必要があります。現在のコードは、1024 文字以下の行に対してのみ機能します。任意の数の行を保存するには、すべての行を 1 つの大きな std::string に連結するか、行ごとのアクセスを簡単にしたい場合は、それらstd::vectorを文字列の中に保存できます。直接読み取りstd::string、C++ にメモリ管理を処理させるには、std::getline()代わりに使用します。cin.getline()

#include <iostream>
#include <string>
#include <vector>

int main()
{
    std::string line;
    std::vector<std::string> lines;
    while (std::getline(std::cin, line)) {
        lines.push_back(line);
    }

    // do something with lines, eg. print them by iterating through the vector
    // and printing each string in it
}
于 2013-03-04T09:36:26.170 に答える