1

私は C++ でのプログラミングに非常に慣れていませんが、文字列から特定の単語をフィルター処理して特定のアクションを実行するコードを作成しようとしています。何らかの理由で、コードは文字列内のテキストを認識しません。

printf("%s \n", data.c_str());
cout << data;

これはまったく何も示していません。つまり、ファイルを使用し.findたり、ファイルに書き込んだりできません。

printf("%s \n", data);

これはまさに私が必要とするものを示しています。

アセンブリを使用してコードをデータに書き込んでいます。

mov data, EDX

最後の方法しか使えないのはなぜですか?

編集:データは次のように開始されます: std::string data;

4

4 に答える 4

1

\natprintfがストリームをフラッシュするため、2 つの関数呼び出しは同等ではありません。試してみてください:

cout << data << endl;
于 2012-06-23T22:22:01.057 に答える
0

使用したことを確認してください

#include <string>

ファイルヘッダーに。これを使用すると、使用できるはずです

std::cout << data << endl;

問題なし。std にグローバル名前空間を使用している場合は、std:: は必要ないかもしれませんが、デバッグを高速化し、問題の可能性を排除するために、とにかく入れておきます。

于 2012-06-23T23:36:37.060 に答える
0

要するに

最後に改行を入れないと、 coutで問題が発生します。

詳細に

(例: ) に を追加するか、次の命令を使用して cout の「即時出力」を有効endlにします(最初に改行する必要はありません)。coutstd::cout << data << std::endl

std::cout << std::unitbuf;

完全な例:

std::cout << std::unitbuf;
std::cout << data; 

// ... a lot of code later ...
std::cout << "it still works";

補足: 名前が示すように、これは出力バッファリングに関係していunitbufます (ここで実際に何が起こっているかを調べたい場合)。

このようにして、現在の行を書き換えることもできます。これは、これが必要な場合の良い例です;-)

実用例

using namespace std;

cout << "I'm about to calculate some great stuff!" << endl;
cout << unitbuf;

for (int x=0; x<=100; x++)
{
    cout << "\r" << x << " percent finished!";

    // Calculate great stuff here
    // ...

    sleep(100);  // or just pretend, and rest a little ;-)
}
cout << endl << "Finished calculating awesome stuff!" << endl;

備考:

  • \r (改行) はカーソルを行の最初の位置に置きます (改行なし)
  • 前に書いた行に短いテキストを書く場合は、最後にスペース文字で上書きしてください

プロセスのどこかに出力します。

I'm about to calculate some great stuff!
45 percent finished!

..そしてしばらくして:

I'm about to calculate some great stuff!
100 percent finished!
Finished calculating awesome stuff!
于 2014-11-28T10:52:19.857 に答える