我希望我的应用能够从命令行参数或标准输入指定的文件中读取,因此用户可以使用它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
同样有用。
答案 0 :(得分:8)
stdin
以TextReader
到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.In
将Console.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迭代每个输入。
答案 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构造函数之前必须转换为流。