C # streamreader и streamwriter на один файл - PullRequest
0 голосов
/ 22 сентября 2018

Как мне читать и писать в один и тот же файл?

Пример моего кода выглядит следующим образом:

List<string> Data = new List<string>();

StreamReader sr = new StreamReader(@"C:\Users\manda\Desktop\Schule\Pos1\HüW2Casino\Spieler1.conf");

StreamWriter sw = new StreamWriter(@"C:\Users\manda\Desktop\Schule\Pos1\HüW2Casino\Spieler1.conf");

while ((line = sr.ReadLine()) != null)
{
    Data.Add(line);
}

int budget = int.Parse(Data[1].Substring(15, 3));

for (int i = 0; i < Data.Count; i++)
{
    if (Data[i] != "ENDE")
    {
        numb = rnd.Next(0, 7);

        if (Data[i].Substring(0,1) == "0" || Data[i].Substring(0, 1) == "1" || Data[i].Substring(0, 1) == "2" || Data[i].Substring(0, 1) == "3" || Data[i].Substring(0, 1) == "4" || Data[i].Substring(0, 1) == "5" || Data[i].Substring(0, 1) == "6" || Data[i].Substring(0, 1) == "7")
        {
            betnumb = int.Parse(Data[i].Substring(0, 1));
            betamount = int.Parse(Data[i].Split(' ') [1]);

            if (betnumb == numb)
            {
                budget += betamount * 7;
            }
            else
            {
                budget -= betamount;
            }

            if (budget < 0)
            {
                sw.Write("Pleite");
                Console.WriteLine("Pleite");
            }
        }
    }
}

Но кажется, что я не могу читать и писать на неготот же файл, так как нет изменений в файле, никогда.

Может быть, кто-нибудь знает, в чем моя проблема?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Вы никогда не закроете 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.

0 голосов
/ 22 сентября 2018

Используйте Flush , чтобы отразить изменения в файле или установить StreamWriter.AutoFlush = true

List<string> Data = new List<string>();
string path = @"C:\Users\manda\Desktop\Schule\Pos1\HüW2Casino\Spieler1.conf"

FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
StreamReader sr = new StreamReader(fs);
StreamWriter sw = new StreamWriter(fs);

while ((line=sr.ReadLine()) != null)
{
   Data.Add(line);
}

int budget = int.Parse(Data[1].Substring(15, 3));

for (int i = 0; i < Data.Count; i++)
{
    if (Data[i] != "ENDE")
    {
       numb = rnd.Next(0, 7);

       if (Data[i].Substring(0,1) == "0" || Data[i].Substring(0, 1) == "1" || Data[i].Substring(0, 1) == "2" || Data[i].Substring(0, 1) == "3" || Data[i].Substring(0, 1) == "4" || Data[i].Substring(0, 1) == "5" || Data[i].Substring(0, 1) == "6" || Data[i].Substring(0, 1) == "7")
       {
           betnumb = int.Parse(Data[i].Substring(0, 1));
           betamount = int.Parse(Data[i].Split(' ') [1]);

           if (betnumb == numb)
           {
              budget+=betamount*7;
           }
           else
           {
               budget -= betamount;
           }

           if (budget < 0)
           {
               sw.Write("Pleite");
               sw.Flush();

               Console.WriteLine("Pleite");
           }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...