-1

文字列が 20 文字以内で、C++ でスペースを含むことができる場合、文字列をどのように読み取るでしょうか? たとえば、次のようなファイルがあります。

3
Namama               4 5 12
Cool                 4 2 34
Not So Cool          4 2 45

できるだけ基本的な方法で書きたいと思います。そして、この場合は C++ のみを使用することをお勧めします (C のものは使用しません)。これは、std::string に格納することを意味します。

istream::getまたはistream::getlineを使用できますが、改行文字を避ける必要があります。これには問題があります (そして、私が書いているコードは初心者に見せる予定です)。

この問題の解決策は何ですか?

編集:

尋ねられたので、私が試したことをお話ししますが、うまくいくとは思いません。私は C++ の初心者ではなく、通常はistream::getや char 配列などを使用していましたが、改行文字を削除することは一部の人にとっては専門的すぎるように思えるかもしれません。

だから... istream::operator>>を使用してchar 配列またはstd::stringを読み取ると、スペース文字が表示されると読み取りが停止するため失敗します (いくつかの単語を読み取る必要がある場合があります)。これは、次のコードが失敗することを意味します。

char name[21];
std::cin >> name;

また...

std::string name;
std::cin >> name;

もう1つのことは、改行文字がシステムごとに異なり、実際にWindowsはデフォルトでそのうちの2つを使用することです。Windowsでistream::ignoreを引数として2で使用しようとしましたが、それが改行を無視する唯一の方法でした。これは、Windows が改行記号に 2 文字を使用するためであると結論付けました。つまり、Linux では動作せず、より複雑にする必要があります... 繰り返しになりますが、初心者には悪いことです。

4

2 に答える 2

2

正確に20 文字を読みたい場合は、

for(int i=0; i<3; ++i) {
    std::string result;
    int one, two, three;

    result.resize(20);
    if (!std::cin.read(&result[0], 20)) throw std::runtime_error("reading buffer failed!");

    if (!std::cin >> one >> two >> three) throw std::runtime_error("reading numbers failed!");
    if (!std::cin.ignore(1000, '\n')) throw std::runtime_error("ignore failed!");
}

正確に 20 文字にしたくない場合、文字列の最後に達したことをどのように知るのでしょうか?

于 2011-10-06T18:35:17.877 に答える
0

これを実現する 1 つの方法は、istream::read を使用して十分なサイズの一時バッファーに入れ、そのバッファーを使用して std::string を初期化することです。

char name[21];
std::cin.read(name, 20);
std::string nameString(name); // If you want it in a std::string

これは、正確に 20 文字、改行、およびすべてを読み取ります。エクササイズの場合、これは少なくとも非常に簡単です。20 文字未満が必要な場合は、余分に読み取られた文字数を特定し、std::istream::unget または同等の方法で get ポインターを戻すことができます。

于 2011-10-06T19:04:43.013 に答える