【问题标题】:StreamReader using arraylist or arrayStreamReader 使用数组列表或数组
【发布时间】:2012-08-09 09:25:07
【问题描述】:

这是我的代码:

StreamReader reader = new StreamReader("war.txt");
string input = null;

while ((input = reader.ReadLine()) != null)
{
    Console.WriteLine(input);
}

reader.Close();

上面的程序从文件“war.txt”中逐行读取并打印出来。我需要重新编写程序,以便它以相反的顺序打印出来,即最后一行在前,第一行在最后。例如,如果“war.txt”包含以下内容:

Hello.

How are you?

Thank you.

Goodbye.

程序应该打印出来:

Goodbye.

Thank you.

How are you?

Hello.

我是 C# 的新手,请帮助!谢谢!

【问题讨论】:

  • 顺便说一句; StreamReaderIDisposable;你应该是using,即using(var reader = new StreamReader("war.txt")) {...}
  • 这对我来说很像家庭作业 :)

标签: c# arrays arraylist streamreader


【解决方案1】:

为此,您将不得不缓冲数据无论如何(除非您使用FileStream API 进行一些棘手的工作以向后读取文件)。怎么样:

var lines = File.ReadAllLines("war.txt");
for(int i = lines.Length - 1; i >= 0; i--)
    Console.WriteLine(lines[i]);

它只是将文件(按行)加载到数组中,然后从末尾开始打印数组。

它的 LINQ 版本是:

foreach(var line in File.ReadLines("war.txt").Reverse())
    Console.WriteLine(line);

但坦率地说,数组版本更有效。

【讨论】:

  • (注意:File.ReadLines 是 .NET 4.0 及以上版本)
【解决方案2】:

你可以使用递归来做到这一点:

void printReverse(int n)
{
   String line = reader.readLine();

   if (n > 0)
     printReverse(n-1);

   System.out.println(line);
}

【讨论】:

  • 对于任何重要的文件,这可能会破坏堆栈。
【解决方案3】:

看看将这些行添加到List,然后在列表中使用Reverse,然后可能使用ForEach 来输出项目。

【讨论】:

    【解决方案4】:

    另一种选择:在阅读时将每一行存储到Stack 中。读取文件后,弹出堆栈以倒序打印行。

    【讨论】:

      【解决方案5】:

      使用可枚举的扩展函数,这可以做得更短:

      foreach(var l in File.ReadAllLines("war.txt").Reverse())
          Console.WriteLine(l);
      

      【讨论】:

        【解决方案6】:

        试试

        File.ReadAllLines(myFile)
            .Reverse();
        

        完整代码

        var list =  File.ReadAllLines(filepath).Reverse().ToList();
                   foreach (var l in list)
                       Console.WriteLine(l);
        

        实现细节

        Enumerable.Reverse Method - 反转序列中元素的顺序

        File.ReadAllLines Method (String) - 打开一个文本文件,读取文件的所有行,然后关闭文件。

        【讨论】:

        • 你为什么要在空间上分裂?
        • @MarcGravell - 我想所以我删除了它,不需要它
        【解决方案7】:

        这里是一个例子,记得添加“使用 System.IO”

        试试

                {
                    const int Size = 7;
                    decimal[] numbers = new decimal[Size];
                    decimal total = 0m;
        
                    int index = 0;
        
                    StreamReader inputfile;
        
                    inputfile = File.OpenText("Sales.txt");
        
                    while (index < numbers.Length && !inputfile.EndOfStream)
                    {
                        numbers[index] = decimal.Parse(inputfile.ReadLine());
                        index++;
                    }
        
                    inputfile.Close();
        
                    foreach (decimal Sales in numbers)
                    {
                        outputlistBox1.Items.Add(Sales);
                        total = total + Sales;
                    }
        
                    textBox1.Text = total.ToString();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
        

        【讨论】:

          【解决方案8】:

          这是我几年前买的一本教科书的另一个例子,它有最高/最低/平均分数..(记得使用'using System IO;)

          private double Average(int[] iArray)

              {
                  int total = 0;
                  double Average;
          
                  for (int index = 0; index < iArray.Length;
                      index++)
                 {
                      total += iArray[index];
                 }
          
                  Average = (double) total / iArray.Length;
          
                  return Average;
              }
          
              private int Highest(int[] iArray)
              {
                  int highest = iArray[0];
          
                  for (int index = 1; index < iArray.Length; index++)
                  {
                      if (iArray[index] > highest)
                      {
                          highest = iArray[index];
                      }
                  }
          
                  return highest;
              }
          
              private int Lowest(int[] iArray)
              {
                  int lowest = iArray[0];
          
                  for (int index = 1; index < iArray.Length; index++)
                  {
                      if (iArray[index] < lowest)
                      {
                          lowest = iArray[index];
                      }
                  }
          
                  return lowest;
              }
          
              private void button1_Click(object sender, System.EventArgs e)
              {
                  try
                  {
                      const int SIZE = 5;
                      int[] Scores = new int [SIZE];
                      int index = 0;
                      int highestScore;
                      int lowestScore;
                      double averageScore;
                      StreamReader inputFile;
          
                      inputFile = File.OpenText("C:\\Users\\Asus\\Desktop\\TestScores.txt");
          
                      while (!inputFile.EndOfStream && index < Scores.Length)
                      {
                          Scores[index] = int.Parse(inputFile.ReadLine());
                          index++;
                      }
          
                      inputFile.Close();
          
                      foreach (int value in Scores)
                      {
                          listBox1.Items.Add(value);
                      }
          
                      highestScore = Highest(Scores);
                      lowestScore = Lowest(Scores);
                      averageScore = Average(Scores);
          
                      textBox1.Text = highestScore.ToString();
                      textBox2.Text = lowestScore.ToString();
                      textBox3.Text = averageScore.ToString("n1");
          
                  }
                  catch (Exception ex)
                  {
                      MessageBox.Show(ex.Message);
                  }
              }
          
              private void button2_Click(object sender, EventArgs e)
              {
                  this.Close();
              }      
          }
          

          }

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-26
            • 2017-06-14
            • 1970-01-01
            相关资源
            最近更新 更多