如何在命令行参数中读取文件否则标准? (模拟Python的文件输入)

时间:2012-10-07 18:00:46

标签: c# .net

我希望我的应用能够从命令行参数或标准输入指定的文件中读取,因此用户可以使用它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同样有用。

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分: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);
    }
}

另一个好主意是迭代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);
    }
}
祝你好运!

答案 2 :(得分:0)

使用

 static void Main(string[] args)

然后在for循环中使用args.length迭代每个输入。

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

答案 3 :(得分:-1)

试试这个:

public void Main(string[] args)
        {
            if (args.Count() > 0)
            {

                byte[] byteArray = Encoding.UTF8.GetBytes(args[0]);
                MemoryStream stream = new MemoryStream(byteArray);

                StreamReader sr = new StreamReader(stream);
                String line = sr.ReadToEnd();
                Console.WriteLine(line);
            }
            Console.ReadLine();
        }

args [0]是一个字符串,在传递给StreamReader构造函数之前必须转换为流。