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 ответа:
Вы можете использовать
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)); }