В моей программе у меня есть некоторый код, который сохраняет записи игрока в текстовый файл, организуя данные в словарь и в другом игровом сеансе, если игрок хочет загрузить свои ранее существующие данные, он должен ввести свое имя в текстовое поле, и если есть набор данных, который соответствует имени, он загрузит данные обратно.
У меня проблема в том, что я не уверен, работает ли код, который у меня сейчас есть. Он говорит, что ошибок нет, но я хотел бы проверить с людьми, у которых больше опыта, чтобы убедиться, что я правильно настроил. Я включил методы записи файлов и чтения файлов ниже на случай, если кто-то захочет увидеть метод записи файлов.
private void FileWriter(string playername, int playerwins, int computerwins, int ties)
{
var records = new Dictionary<string, (int playerwins, int computerwins, int ties)>
{
{playername, (playerwins, computerwins, ties)}
};
StreamWriter inputfile;
inputfile = File.AppendText("Records.txt");
inputfile.WriteLine(records);
inputfile.Close();
}
private void FileReader(string playername, int playerwins, int computerwins, int ties, IEnumerable<KeyValuePair<string, (int, int, int)>> records)
{
StreamReader outputfile;
outputfile = File.OpenText("Records.txt");
while (!outputfile.EndOfStream)
{
foreach(KeyValuePair<string, (int, int, int)> res in records)
{
if (playername == res.Key)
{
playerwins +=playerwins;
computerwins += computerwins;
ties += ties;
}
}
}
}
Что происходит, если нет Records.txt?
Нет, ридер тоже не в порядке
Хорошо, я сдаюсь. Чего вы пытаетесь достичь?
Как вы думаете, что произойдет в этой строке? входной файл.WriteLine(записи); Если вы думаете, что эта строка записывает значения словаря в файл, вы ошибаетесь. В этой строке записывается имя класса записей переменных, поскольку словарь не может преобразовать свои значения в строку, требуемую WriteLine.
У вас есть ввод и вывод в обратном направлении. Вход — чтение, вывод — запись.
В вашем коде есть некоторые проблемы как в методах FileWrite, так и в FileReader.
В FileWriter у вас ошибка в строке, которая записывает в файл. Передача переменной records в StreamWriter.WriteLine приведет к тому, что имя класса будет записано в файл, а не значение элементов, хранящихся в словаре.
private void FileWriter(string playername, int playerwins, int computerwins, int ties)
{
var records = new Dictionary<string, (int playerwins, int computerwins, int ties)>
{
{playername, (playerwins, computerwins, ties)}
};
using StreamWriter inputfile = File.AppendText(@"Records.txt");
// Get the first element in the array
var kvp = records.ElementAt(0);
// write the key and the values into the file.
inputfile.WriteLine($"{kvp.Key},{kvp.Value.playerwins},{kvp.Value.computerwins},{kvp.Value.ties}");
}
Конечно, это следует использовать только для упражнения, потому что на самом деле вам не нужно создавать словарь с одним элементом, а затем записывать один элемент на диск. Просто запишите непосредственно значения, переданные методу, в файл.
У FileReader гораздо больше проблем. Логика кода неверна. Сначала вы должны проверить, содержит ли словарь имя игрока, а затем извлечь информацию KeyValuePair, используя синтаксис массива. После этого вы можете запустить цикл для чтения строки за строкой, пока не найдете игрока, соответствующего переданному ключу. На этом этапе вы можете начать дополнения
private void FileReader(string playername, int playerwins, int computerwins, int ties, IEnumerable<KeyValuePair<string, (int, int, int)>> records)
{
// Check if the dictionary contains the player
if (records.ContainsKey(playername))
{
// get the KeyValuePair entry for that player by the key
var kvp = records[playername];
using StreamReader outputfile = File.OpenText("Records.txt");
while (!outputfile.EndOfStream)
{
// Read a line and splits its content in 4 parts
string line = outputfile.ReadLine();
var parts = line.Split(',');
// If is the line that matches our key...
if (parts[0] == playername)
{
// Do the additions.
playerwins += Convert.ToInt32(kvp.Value.playerwins);
computerwins += Convert.ToInt32(kvp.Value.computerwins);
ties += Convert.ToInt32(kvp.Value.ties);
// No sense to continue reading the file if we have found the player
break;
}
}
}
}
У этого FileReader все еще есть проблемы. Переменные, переданные здесь, являются локальными для этого метода, и изменение значений здесь не влияет на переменные, переданные из вызывающего метода. Также переменная Records должна быть глобальной, чтобы ее можно было использовать здесь. Но это материал для другого вопроса/ответа.
В вашем файле Records.txt всегда есть только одна строка. Я правильно интерпретирую это? Читатель кажется мне нормальным, но Писатель немного загадочен.