StreamReader不读取回车符

时间:2013-08-06 17:07:08

标签: c# streamreader

我必须为我正在服用的计算机课程编写一个控制台应用程序。程序使用StreamReader从文件中读取文本,将字符串拆分为单个单词并将其保存在String数组中,然后向后打印单词。

每当文件中有回车符时,文件就会停止读取文本。有人可以帮我这个吗?

这是主程序:

using System;
using System.IO;
using System.Text.RegularExpressions;

namespace Assignment2
{
    class Program
    {
        public String[] chop(String input)
        {
            input = Regex.Replace(input, @"\s+", " ");
            input = input.Trim();

            char[] stringSeparators = {' ', '\n', '\r'};
            String[] words = input.Split(stringSeparators);

            return words;
        }

        static void Main(string[] args)
        {
            Program p = new Program();

            StreamReader sr = new StreamReader("input.txt");
            String line = sr.ReadLine();

            String[] splitWords = p.chop(line);

            for (int i = 1; i <= splitWords.Length; i++)
            {
                Console.WriteLine(splitWords[splitWords.Length - i]);
            }

            Console.ReadLine();

        }
    }
}

这是文件“input.txt”:

This is the file you can use to 
provide input to your program and later on open it inside your program to process the input.

3 个答案:

答案 0 :(得分:3)

您可以使用StreamReader.ReadToEnd代替StreamReader.ReadLine

// Cange this:
// StreamReader sr = new StreamReader("input.txt");
// String line = sr.ReadLine();

string line;
using (StreamReader sr = new StreamReader("input.txt"))
{
    line = sr.ReadToEnd();
}

添加using块将确保输入文件也正确关闭。

另一个替代方案就是使用:

string line = File.ReadAllText("input.txt"); // Read the text in one line

ReadLine从文件中读取单行,并删除尾随的carraige返回和换行符。

ReadToEnd会将整个文件作为单个字符串读取,并保留这些字符,从而使chop方法按照书面形式工作。

答案 1 :(得分:3)

你只是在一行阅读。您需要读取所有行直到文件末尾。 以下应该有效:

    String line = String.Empty;
    using (StreamReader sr = new StreamReader("input.txt"))
    {
        while (!sr.EndOfStream)
        {
            line += sr.ReadLine();
        }
    }

答案 2 :(得分:2)

问题在于你正在调用ReadLine(),它正是这样做的,直到它遇到回车符(你必须在循环中调用它)。

通常,如果您想逐行读取文件StreamReader,实现看起来更像是这样(来自msdn);

        using (StreamReader sr = new StreamReader("TestFile.txt")) 
        {
            string line;
            // Read and display lines from the file until the end of  
            // the file is reached. 
            while ((line = sr.ReadLine()) != null) 
            {
                Console.WriteLine(line);
            }
        }

while循环中的条件可确保您将读取直到文件末尾,因为如果没有任何内容可读,ReadLine将返回null

另一种选择就是使用File.ReadAllLines(MyPath),它将返回一个字符串数组,每个元素都是文件中的一行。提供更完整的例子;

  string[] lines = File.ReadAllLines(MyFilePath);
  foreach(string line in lines)
  {
        string[] words = line.Split(' ').Reverse();
        Console.WriteLine(String.Join(" ", words));
  }

这三行代码执行以下操作:将整个文件读入字符串数组,其中每个元素都是一行。循环遍历该数组,在每一行上我们将它分成单词并反转它们的顺序。然后我将所有单词连接在一起,并将它们之间的空格连接起来并将其打印到控制台。如果你想以相反的顺序整个文件,那么你需要从最后一行而不是第一行开始,我会把这个细节留给你。