StreamReader не читает в возврате каретки


Я должен написать консольное приложение для компьютерного курса, который я принимаю. Программа считывает текст из файла с помощью StreamReader, разбивает строку на отдельные слова и сохраняет их в массиве строк,а затем выводит слова обратно.

Всякий раз, когда в файле есть возврат каретки, файл перестает читать текст. Может ли кто-нибудь помочь мне с этим?

Вот основная программа:

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 4

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 работайте так, как написано.

Вы просто читаете в одной строке. Вам нужно прочитать все строки до конца файла. Должно сработать следующее:

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

Проблема в том, что вы вызываете 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));
  }
Эти три строки кода делают следующее: считывает весь файл в массив строк, где каждый элемент является строкой. Перебираем этот массив, на каждой строке разбиваем его на слова и меняем их порядок. Затем я соединяю все слова вместе с пробелами между ними и печатаю его на консоль. Если вы хотите весь файл в обратном порядке, то вам нужно начать с последняя строка вместо первой, я оставлю эту деталь вам.