0

txt ファイルを別の txt ファイルで上書きする必要がある小さなコンソール アプリを作成していますが、最終的には 3 回実行されます。これは、IO 書き込みプロセスが IO 出力プロセスよりも遅いためだと思います。ループを一度だけ実行するにはどうすればよいですか?

コードは次のとおりです。

while (confirm != 'x') {
    Console.WriteLine(
        "Do you want to copy the archive to test2.txt? (y)es or e(x)it");
    confirm = (char)Console.Read();
    if (confirm == 's') {
        File.Copy("C:\\FMUArquivos\\test.txt", 
                  "C:\\FMUArquivos\\test2.txt", true);
        Console.WriteLine("\nok\n");
    }
    Console.WriteLine("\ncounter: " + counter);
    counter += 1;
}
4

3 に答える 3

3

ヒットした場合y<enter>、これにより 3 文字のシーケンス"y"+ <cr>+が得られ<lf>、3 回の反復が生成されるため、カウンターが 3 増加しますReadLine。代わりに使用します。

int counter = 0; 
while (true) {
    Console.WriteLine("Do you want to copy ...");
    string choice = Console.ReadLine();
    if (choice == "x") {
        break;
    }
    if (choice == "y") {
        // Copy the file
    } else {
        Console.WriteLine("Invalid choice!");
    }
    counter++;
}
于 2012-06-03T23:19:36.107 に答える
1

このコードを試してください:

var counter = 0;

Console.WriteLine("Do you want to copy the archive to test2.txt? (y)es or e(x)it");
var confirm = Console.ReadLine();

while (confirm != "x")
{
    File.Copy("C:\\FMUArquivos\\test.txt", "C:\\FMUArquivos\\test2.txt", true);
    Console.WriteLine("\nok\n");

    counter += 1;
    Console.WriteLine("\ncounter: " + counter);

    Console.WriteLine("Do you want to copy the archive to test2.txt? (y)es or e(x)it");
    confirm = Console.ReadLine();
}

続行するかどうかを尋ねられます。押すとy(または 以外の何かを押すとx)、ファイルがコピーされ、"\nok\n" と "1" が出力されます。すると再度聞かれますので、 を押すxと止まります。

于 2012-06-03T23:15:57.577 に答える
1

コードをコピーして実行したので、問題がわかりました。「Read」への呼び出しを「ReadLine」に置き換え、確認タイプを文字列に変更して比較する必要があります。

その理由は、「Enter」を押したときにのみ Console.Read が返されるため、3 文字を読み取るためです。's' '\r', '\n' (最後の 2 つは Windows では改行です)。

Console.Read の API リファレンスについては、http://msdn.microsoft.com/en-us/library/system.console.read.aspx を参照してください。

これを試して;

string confirm = "";
int counter = 0;
while (confirm != "x")
{
    Console.WriteLine("Do you want to copy the archive to test2.txt? (y)es or e(x)it");
    confirm = Console.ReadLine();
    if (confirm == "s")
    {
        File.Copy("C:\\FMUArquivos\\test.txt",
            "C:\\FMUArquivos\\test2.txt", true);
        Console.WriteLine("\nok\n");
    }
    Console.WriteLine("\ncounter: " + counter);
    counter += 1;
}
于 2012-06-03T23:20:10.593 に答える