繁体   English   中英

C#streamreader和streamwriter到同一文件

[英]C# streamreader and streamwriter onto same file

我如何读写同一文件?

我的代码示例如下所示:

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");
            }
        }
    }
}

但似乎我无法在同一个文件上读写,因为从不对文件进行任何更改。

也许有人知道我的问题是什么?

使用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");
           }
        }
    }
}

您永远不会关闭StreamWriter 因此,永远不会刷新新内容,并且文件保持打开状态。 包围StreamWriterusing语句来自动地冲洗和关闭该文件在末端或每当使用块留(也可以是因为一个的break ,一个return或和异常)。

如果打算将数据追加到文件,则可以使用File.AppendText(Path)创建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.

您可以进行一些优化和更正。 我想您想在到达"ENDE" (德语为“ end”)时停止for循环。 您可以通过将此条件添加到for循环条件中来做到这一点: i < data.Length && data[i] != "ENDE"

破产( budget < 0 )时,您也可能不想继续循环。 您可以使用break;退出循环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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM