【问题标题】:C# Reading a text file provided via the command line in the way of StandardInputC#以StandardInput的方式读取通过命令行提供的文本文件
【发布时间】:2016-07-15 23:49:28
【问题描述】:

我正在尝试找出旧的 FizzBu​​zz 挑战。我弄清楚了 FizzBu​​zz 部分背后的逻辑(打印 Fizz 表示可被 3 整除的数字,Buzz 表示可被 5 整除的数字,FizzBu​​zz 表示可被两者整除的数字)。

说明:

玩家通常围成一圈。第一个玩家说出数字“1”,每个玩家依次说出下一个数字。但是,任何可被 X 整除的数字(例如,三)都将替换为 fizz 一词,任何可被 Y 整除的数字(例如,五)都将替换为 Buzz 一词。能被两者整除的数字变成了嗡嗡声。犹豫不决或犯错的玩家将被淘汰出局。 编写一个程序,打印出最终的一系列数字,其中那些能被 X、Y 整除的数字被替换为“F”代表嘶嘶声,“B”代表嗡嗡声,“FB”代表嘶嘶声。

输入样本: 你的程序应该接受一个文件作为它的第一个参数。该文件包含多个分隔行;每行包含 3 个以空格分隔的数字。第一个数字是第一个分频器(X),第二个数字是第二个分频器(Y),第三个数字是你应该数多远(N)。您可以假设输入文件的格式正确,并且数字是有效的正整数。

例如: 3 5 10 2 7 15

输出样本: 打印出系列 1 到 N 用“F”替换能被 X 整除的数字,用“B”替换能被 Y 整除的数字,用“FB”替换能被两者整除的数字。由于输入文件包含多组值,因此您的输出应每组打印出一行。确保打印的每一行中没有尾随空格。

1 2 F 4 B F 7 8 F B 1 F 3 F 5 F B F 9 F 11 F 13 FB 15

约束:

• 测试用例数≤20

• “X”在 [1, 20] 范围内

• “Y”在 [1, 20] 范围内

• “N”在 [21, 100] 范围内

我不是在找人为我做这件事,只是帮助我更好地理解我是如何阅读文本文件的。如果这是一个“愚蠢”的问题,我深表歉意。我研究了微软的开发网络页面以进行澄清,但这让我更加困惑......谢谢。

【问题讨论】:

  • 从说明看来,您的程序不应从 StandardInput 读取。它应该读取命令行参数以获取文件名,然后它应该打开并读取该文件。
  • @TannerSwett 我也是这么想的。向我提供了额外的说明... // 输入将是通过命令行以 StandardInput 的方式提供的文本文件 //您需要实现 Parse 输入并将结果发送到 StandardOutput //使用任何对象结构您想使用,ParseInput 返回类型是可变的。
  • 问题太宽泛了,应该拆分成:“如何从stdin读取”和“如何解决FizzBu​​zz”或者从stdin读取后遇到的下一个问题。

标签: c# .net visual-studio file fizzbuzz


【解决方案1】:

标准输出(stdout)只是常规的控制台输出;

要发送东西给它,只需Console.WriteLine

发送到 stderr Console.Error.WriteLine,但挑战不需要。

CodeEval 的挑战不需要您从 stdin 输入任何内容,您只需从 Main 方法:

public static void Main(string[] args)
{
    var fileContent = File.ReadAllText(args[0]);
}

如果你必须有效地阅读 stdin,你可以使用 Console.ReadLine:

string line;

while ((line = Console.ReadLine()) != null)
{
    // Do whatever you need to do with the line variable read from the stdin.
}

或与您提供的代码集成:

using (var reader = new StreamReader(Console.OpenStandardInput()))
{
    Console.WriteLine(FizzBuzz.ParseInput(reader));
}

如果您只需要解析文本,还有另一个选择:Console.In

【讨论】:

  • 感谢您的回复!它开始变得更有意义了。除了这个方法之外,我还获得了一些 main 代码,即 using (System.IO.StreamReader reader = new System.IO.StreamReader(Console.OpenStandardInput()))public static object ParseInput(string fileName) { using (System.IO.StreamReader input = System.IO.File.OpenText(fileName)) { return FizzBuzz.ParseInput(input); } }
  • Console.OpenStandardInput 给你一个 Streamstdin 读取,如果你正在对 CodeEval 进行挑战,我认为输入是作为参数提供,如果您使用他们提供的网络编辑器而不是上传您的解决方案,则可以确认这一点;我认为他们的样板代码使用new FileStream(args[0]),我会仔细检查。
  • 确认,您尝试提交时使用的在线编辑器使用:using (StreamReader reader = File.OpenText(args[0]))。如果是不同的站点,可能会使用 stdin 代替;在这种情况下,您可以使用您的示例或我的最后一个示例。
  • 是的,这个不适合 CodeEval。我会玩弄它。我相信我确实需要使用 stdin。谢谢!
  • 对于如何打开这个文件,我还是有点迷茫。对不起,我还在学习很多概念。我用我的代码更新了我的原始帖子。正如我所提到的,其中一些是在挑战中提供的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
相关资源
最近更新 更多