1

特定の条件を満たす文字をstdinライブラリから読み込もうとしていますiostreamが、条件を満たさない文字は残して、stdinスキップされた文字を後で読み取ることができます。出来ますか?

たとえば、文字a-cのみが必要で、入力ストリームはabdddcxa.

最初にa-c - abca;のすべての文字を読み込みます。この入力が終わったら、残りの文字を読み始めますdddx。(この 2 つの入力は同時に発生することはありません。2 つの異なる機能にある可能性があります)。

4

4 に答える 4

3

すべてを読み取り、入力を必要な 2 つの部分に分割し、最後に各部分を処理する必要がある関数に送信する方が簡単ではないでしょうか?

stdin バッファーにデータを保持することは、グローバルを使用することに似ています。プログラムを理解しにくくし、処理中に他のコード (またはユーザー) がバッファーの内容を変更するリスクを残します。

一方、プログラムを「データを読み取る部分」「データを解析して作業を分担する部分」「作業を行う部分」に分割すると、構造化されたプログラムが理解しやすくなります。そしてテスト。

おそらくregex、実際の分割を行うために使用できます。

于 2013-05-27T19:43:26.137 に答える
2

What you're asking for is the putback method (for more details see: http://www.cplusplus.com/reference/istream/istream/putback/). You would have to read everything, filter the part that you don't want to keep out, and put it back into the stream. So for instance:

cin >> myString;

// Do stuff to fill putbackBuf[] with characters in reverse order to be put back

pPutbackBuf = &putbackBuf[0];
do{
    cin.putback(*(pPutbackBuf++));
while(*pPutbackBuf);

Another solution (which is not exactly what you're asking for) would be to split the input into two strings and then feed the "non-inputted" string into a stringstream and pass that to whatever function needs to do something with the rest of the characters.

于 2013-05-27T19:37:04.017 に答える
1

あなたがやりたいことは、一般的には不可能です。ungetc存在しputbackますが、複数の文字で機能することは保証されていません。それらは実際には stdin を変更しません。入力バッファをプッシュバックするだけです。

代わりにできることは、入力を文字列に読み取ってその文字列を処理することにより、明示的に独自のバッファーを保持することです。ただし、多くの場合、ストリームでは安全に巻き戻すことができません。

于 2013-05-27T19:45:07.960 に答える
0

いいえ、ストリームへのランダム アクセスはできません (文字列ストリームの fstream を除く)。行/入力全体を読み込んで、結果の文字列を処理する必要があります (ただし、iostreams/ を使用してstd::stringstream行うことができます)。 )。

于 2013-05-27T19:41:48.690 に答える