Добавить текст с помощью StringReader (после reader.ReadLine())
Сейчас я создаю игровое приложение с использованием C#, которое потребует загрузки из текстового файла сценария игры. (Это довольно простая игра визуального романа)
Теперь, когда загружается основная форма, я загружаю скрипт из файла script.txt И я объявил:
StringReader reader = new StringReader(script);
в качестве глобальной переменной там
Теперь в середине игры, где читатель находится в середине строкового скрипта, мне нужно добавить, начиная со следующей строки читателя. В основном то, чего я хочу достичь:
Добавить все тексты из файла "news.txt" в скрипт, начиная с reader.ReadLine() [т.е. в середине скрипта]
Какое решение будет наиболее эффективным для достижения этой цели?
Что я знаю:
StreamReader sr = new StreamReader("news.txt");
string news = sr.ReadToEnd();
//Now how to append 'news' to reader.ReadLine() ??
Отредактируйте для большего разъяснения (извините, это мой первый раз, когда я спрашиваю здесь): я постараюсь объяснить больше о том, чего я пытаюсь достичь здесь. Что у меня сейчас
//global variables
string script;
StringReader reader;
//during form_load
StreamReader sr = new StreamReader("script.txt");
script = sr.ReadToEnd();
reader - new StringReader(script);
//And as the game progresses, I keep on implementing reader.ReadLine()..
//At one point, the program will ask the user, do you want to watch the news?
DialogResult dialogResult = MessageBox("Do you want to watch the news?", , MessageBoxButtons.YesNo
if(dialogResult == DialogResult.Yes)
{
StreamReader newsSr = new StreamReader("news.txt");
string news = newsSr.ReadToEnd();
//now I want to append the contents of 'news' to the string 'script' after reader.ReadLine() - any best way to implement this?
}
Один из возможных способов (и я думаю, что это также наихудший способ) - это ввести одну переменную count, чтобы получить начальную позицию последнего reader.ReadLine(), и выполнить желаемый результат, используя Insert следующим образом: script = script.Insert(startIndex, новости)
3 ответа
В конце концов мне удалось решить эту проблему. Это то, что я использовал (на случай, если кто-нибудь захочет знать:))
//I'm using a switch statement, in case reader.ReadLine() == "#(morningnews)"
dialogResult = MessageBox.Show("Do you want to watch the news?", , MessageBoxButtons.YesNo);
if(dialogResult = DialogResult.Yes)
{
StreamReader sr = new StreamReader(directoryName + "\\morningactivities\\morningnews1.txt");
string news = sr.ReadToEnd();
script = script.Replace("#(morningnews)", "#(morningnews)\n" + news);
reader = new StringReader(script);
while (reader.ReadLine() != "#(morningnews)")
continue;
loadNextScript();
}
Спасибо всем, кто помог, это вдохновило меня на то, чтобы придумать это.
Вы не можете написать в StringReader
,
Однако, если я понимаю ваш последний вопрос, я думаю, что вы хотите этого.
StreamReader sr = new StreamReader("news.txt");
string news = string.Empty;
string line = sr.ReadLine();
while (line != null)
{
news += line;
news += someOtherString;
line = sr.ReadLine();
}
Кроме того, я бы не стал делать это с конкатенацией строк. Я бы сделал это с StringBuilder
,
Просто загрузите файл в память, используя File.ReadAllLines()
,
Затем вы можете получить к нему доступ в виде массива строк, не беспокоясь о читателях, записывающих устройствах, потоках и т. Д.
Например:
// load files as arrays
string[] scriptLinesArray = File.ReadAllLines("script.txt");
string[] newsLinesArray = File.ReadAllLines("news.txt");
// convert arrays to lists
var script = new List<string>(scriptLinesArray);
var news = new List<string>(newsLinesArray );
// append news list to script list
script.AddRange(news);