7

コマンドライン引数または標準入力で指定されたファイルからアプリで読み取るようにしたいので、ユーザーはそれを使用しmyprogram.exe data.txtたり、otherprogram.exe | myprogram.exe. C#でこれを行うにはどうすればよいですか?


Pythonでは、私は書きます

import fileinput
for line in fileinput.input():
    process(line)

これは、sys.argv[1:] にリストされているすべてのファイルの行を反復し、リストが空の場合はデフォルトで sys.stdin になります。ファイル名が「-」の場合、sys.stdin にも置き換えられます。

Perl<>と Ruby ARGFも同様に便利です。

4

4 に答える 4

8

stdinTextReaderを通じてあなたに公開されますConsole.In。または選択したファイルをTextReader使用する入力用の変数を宣言し、それをすべての入力操作に使用するだけです。Console.In

static TextReader input = Console.In;
static void Main(string[] args)
{
    if (args.Any())
    {
        var path = args[0];
        if (File.Exists(path))
        {
            input = File.OpenText(path);
        }
    }

    // use `input` for all input operations
    for (string line; (line = input.ReadLine()) != null; )
    {
        Console.WriteLine(line);
    }
}

そうしないと、この新しい変数を使用するためのリファクタリングにコストがかかりすぎる場合はConsole.InConsole.SetIn().

static void Main(string[] args)
{
    if (args.Any())
    {
        var path = args[0];
        if (File.Exists(path))
        {
            Console.SetIn(File.OpenText(path));
        }
    }

    // Just use the console like normal
    for (string line; (line = Console.ReadLine()) != null; )
    {
        Console.WriteLine(line);
    }
}
于 2012-10-07T18:37:22.697 に答える
3

実際、それは非常に簡単です。

C# コード エディターでは、次のことができます。

public static void Main(string[] args) {
    //And then you open up a file. 
    using(Streamreader sr = new Streamreader(args[0])) {
            String line = sr.ReadToEnd();
            Console.WriteLine(line);
    }
}

もう 1 つの良いアイデアは、ac# コレクションの項目引数を反復処理して、複数のファイルを入力として取得できるようにすることです。例:main.exe file1.txt file2.txt file3.txtなど。

次のように、特殊な for ループを使用して上記のコードを変更することで、これを行うことができます。

foreach(string s in args) {
    using( Streamreader sr = new Streamreader(s) ) {
        String line = sr.ReadToEnd();
        Console.WriteLine(line);
    }
}

幸運を!

于 2012-10-07T18:06:06.720 に答える
0

使用する

 static void Main(string[] args)

次に、たとえばforループでargs.lengthを使用して各入力を反復処理します。

使用例:http://www.dotnetperls.com/main

于 2012-10-07T18:07:34.800 に答える