Вы никогда не закроете StreamWriter
.Поэтому новый контент никогда не сбрасывается, а файл остается открытым.Вложите StreamWriter
в using
-статеме, который автоматически сбрасывает и закрывает файл в конце или всякий раз, когда оставлен блок использования (также может быть из-за break
, return
или исключения).
Если вы хотите добавить данные в файл, вы можете создать программу записи с помощью File.AppendText(Path)
.
Поскольку вы читаете файл перед тем, как записывать в него, нет смысла сохранятьчитатель открыт во время записи.Вам даже не нужно создавать StreamWriter
.просто прочитайте весь файл в массив с помощью File.ReadAllLines(Path)
.
const string Path = @"C:\Users\manda\Desktop\Schule\Pos1\HüW2Casino\Spieler1.conf";
string[] data = File.ReadAllLines(Path);
int budget = Int32.Parse(data[1].Substring(15, 3));
using (StreamWriter sw = File.AppendText(Path)) {
for (int i = 0; i < data.Length && data[i] != "ENDE"; i++) {
numb = rnd.Next(0, 7);
char digit = data[i][0]; // Take the 1st char instead of Substring(0,1).
if ('0' <= digit && digit <= '7') { // Chars can be compared like numbers.
betnumb = digit - '0'; // You can do math on chars.
betamount = Int32.Parse(data[i].Split(' ')[1]);
if (betnumb == numb) {
budget += betamount * 7;
} else {
budget -= betamount;
}
if (budget < 0) {
sw.Write("Pleite");
Console.WriteLine("Pleite"); // German for "bankrupt".
break; // Probably you don't want to continue looping when bankrupt.
}
}
}
} // Automatically flushes and closes the file here.
Вы можете внести несколько оптимизаций и исправлений.Я предполагаю, что вы хотите остановить цикл for при достижении "ENDE"
(по-немецки «end»).Вы можете сделать это, добавив это условие в условие for-loop: i < data.Length && data[i] != "ENDE"
.
Возможно, вы также не хотите продолжать цикл при банкротстве (budget < 0
).Вы можете выйти из цикла с помощью break;
.Если вы делаете это, это также означает, что вы пишете только один раз файл.В этом случае вы даже можете упростить запись в файл.Вместо использования StreamWriter
:
using (StreamWriter sw = File.AppendText(Path)) {
...
sw.Write("Pleite");
...
}
... вы можете просто написать:
File.AppendAllText(Path, "Pleite");
С этим упрощением код становится:
const string Path = @"C:\Users\manda\Desktop\Schule\Pos1\HüW2Casino\Spieler1.conf";
string[] data = File.ReadAllLines(Path);
int budget = Int32.Parse(data[1].Substring(15, 3));
for (int i = 0; i < data.Length && data[i] != "ENDE"; i++) {
numb = rnd.Next(0, 7);
char digit = data[i][0]; // Take the 1st char instead of Substring(0,1).
if ('0' <= digit && digit <= '7') { // Chars can be compared like numbers.
betnumb = digit - '0'; // You can do math on chars.
betamount = Int32.Parse(data[i].Split(' ')[1]);
if (betnumb == numb) {
budget += betamount * 7;
} else {
budget -= betamount;
}
if (budget < 0) {
File.AppendAllText(Path, "Pleite");
Console.WriteLine("Pleite");
break;
}
}
}
Эти статические методы в File
очень удобны, так как они читают, пишут, открывают и закрывают файл одним оператором.
Вы можете упростить проверку диапазона для первой цифры.Вместо повторного вызова data[i].Substring(0,1)
просто сохраните первый символ с char digit = data[i][0];
.Персонажи ведут себя как целые числа.Вы можете сравнить их ('0' <= digit && digit <= '7'
) и выполнить расчет по ним.digit - '0'
получает значение цифры как int
.
Я сохранил путь к файлу в константе, чтобы избежать его повторения.
Локальные переменные и параметры метода обычно записываются в camelCase,Поэтому я переименовал Data
в data
.