Добавить текст с помощью 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);
Другие вопросы по тегам