2

似たようなタイトルの回答があったのを見たのですが、C++に詳しくない私には内容が濃すぎました。

私はプログラミングに非常に慣れていないため、以前の反復を while ループに格納する方法がわかりません。\nwhile ループを使用してユーザーのテキストをファイルに書き込み、入力を 2文字で終了しようとしています。私の現在のコードでは、入力が 1 つのインスタンスで終了するため、これが私の問題です。

私のコードは次のようになりますが、私は知っtempnew_adviceいて同じです:

char new_advice, temp;
while( (!(new_advice == '\n' + '\n'))) && (!(temp == '\n')) )
{
    temp = new_advice;
    cin.get(new_advice);
    fout.put(new_advice);
}

編集*わかりました、私が求めていたものについて明確ではなかったと思います.

元の割り当てでは、「ユーザーがアドバイスを入力できるようにして、任意の行数にすることができます。ユーザーは、リターン キーを 2 回押してアドバイスを終了するように指示されます。その後、プログラムはそれを確認するためにテストできます。文字 '\n' が 2 回連続して読み取られるタイミングをチェックして、入力の最後に到達しました。"

これにより、私の質問に対する回答が変わりますか?

私は今、コードでこれをやろうとしました:

char new_advice;
         int temp = 0;

         while(temp < 2)
         {
         if(new_advice == '\n')
         {
         temp = temp++;
         }
         cin.get(new_advice);
         fout.put(new_advice);

         }

しかし、これも機能していません。私のプログラムは、Enter をプログラムの終了として認識しません。プログラム全体のコンテキストは投稿する価値がありますか?

4

4 に答える 4

4

私はあなたの特定の質問に答えたくありません。なぜなら、あなたが望むことを行う慣用的な方法はかなり異なり、かなりきれいだからです。

std::ofstream outfile("output.txt");

for (std::string line; std::getline(std::cin, line); )
{
    if (line.empty()) { break; }

    outfile << line << std::endl;
}
于 2012-09-17T23:28:59.197 に答える
1

とてもたくさんのこと。

まず、わかりやすくするために冗長な括弧を削除します。次に、a != bの代わりにを使用し!(a == b)ます。

これにより、が生成されますが、これwhile(new_advice != '\n' + '\n') && temp != '\n')が何をするのかわかりません(コンパイルエラーが発生する括弧の不一致を無視しても):'\n' + '\n'整数の加算である2文字を加算します。ただし、そうではなく、代わりに文字列の連結であったとしても、その後、結果(2文字の文字列)を1文字と比較します。これは決して得られませんtrue

次に、ロジックについて説明します。各行をリターンで区切り、最後にリターン文字を追加します。

std::string line;
while (std::getline(std::cin, line))
    std::cout << line << "\n";

std::cout << "\n";

…πのように簡単です。

しかし、それを超えて、2つの改行で入力を終了することは珍しいことです。むしろ、(UNIXの場合)各行は最後に1つの改行で区切られるのが慣例です。

于 2012-09-17T23:27:28.167 に答える
0

charint式で使用される場合、sはsにプロモートされ+ます。正確に何を比較しようとしていますか?

私のコードは次のようになりますが、tempとnew_adviceが同じであることはわかっています。

その後、これ
(!(new_advice == '\n' + '\n'))) && (!(temp == '\n'))はすぐに失敗します。

そして、あなたの括弧は一致しません。

于 2012-09-17T23:27:09.210 に答える
0

ループを単純化して、入力がある間だけチェックしますwhile(cin) {

以前の値を保存する必要がある場合は、その変数をループの外側にのみ残してください。

char previous = '\0';
while (cin) {

本当に行末を見つけて「\n」を追加したいと思いますが、これはWindowsとUNIXの間で移植できません。std::getlineの回答ははるかにうまく機能します。しかし、あなたがこれを自分でやりたいと仮定すると...

ループ内で現在の文字を宣言して値を指定します。

    char current;
    cin >> current;

次に、もう一度確認して、実際に有効な入力を受け取ったことを再確認cinします。

    if(!cin) {
        break;
    }

次に、このキャラクターで必要なことを何でもします。

    fout << current;
    if(`\n` == current) {
        fout << '\n'; // though std::endl would be more portable
    }

最後に、前の変数を更新します。

    previous = current;
}

関係する複数の概念を理解するために、これを修正する方法を説明しましたが、ほとんどの場合は必要ないと思います。答えはうまくいきますが、std::getlineあなたがやろうとしたすべてのことについてあなたに教えるわけではありません。

于 2012-09-17T23:28:51.147 に答える