如何从命令行参数或标准输入中读取文件?(模拟Python的fileinput)

11 浏览
0 Comments

如何从命令行参数或标准输入中读取文件?(模拟Python的fileinput)

我想让我的应用程序从通过命令行参数指定的文件或标准输入中读取数据,以便用户可以通过myprogram.exe data.txtotherprogram.exe | myprogram.exe来使用它。我该怎么在C#中实现这个功能?


在Python中,我会这样写

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

这会迭代sys.argv [1:]中列出的所有文件的行,如果列表为空,则默认为sys.stdin。如果文件名为\'-\',则它也将被替换为sys.stdin。

Perl的<>和Ruby的ARGF也很有用。

admin 更改状态以发布 2023年5月22日
0
0 Comments

实际上,这非常容易。

在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);
    }
}

另一个好主意是在C#集合中对args项进行迭代,以便您可以将多个文件作为输入。例如: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);
    }
}

祝你好运!

0
0 Comments

stdin 通过 Console.In 对您公开为一个 TextReader。只需声明一个 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.SetIn()Console.In 重定向到您的文件。

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);
    }
}

0