1

我有我的大学作业,这只是非常基本的编码,但我必须这样做

用户应能够将记录存储到文件中。在启动时,用户应该能够选择一个记录文件并将它们加载到程序中。

我遇到了麻烦,因为它会保存,但是一旦我关闭程序并重新打开它,它们就消失了,感谢任何人的帮助。

这是我到目前为止所拥有的:

private void Save_Click(object sender, EventArgs e)
{

    SaveToFile(records, file);
}

private void SaveToFile(List<Client> records, string file)
{

    //File.WriteAllText(file, String.Empty);
    StreamWriter writer = new StreamWriter(file);
    StreamReader reader = new StreamReader(file);

    try
    {
        AddMember();

        for (int i = 0; i < records.Count; i++)
        {
            writer.WriteLine(records[i].WriteToFile());
        }

        writer.Close();
    }
    catch (IOException z)
    {
        MessageBox.Show("Error" + z);
    }
}
4

3 回答 3

0

在关闭 StreamWriter 之前,您应该调用 Flush() 方法。Flush() 清除当前写入器的所有缓冲区,并将所有缓冲数据写入底层流。

于 2013-09-21T05:22:50.363 回答
0
reader.clos();

你忘了这个

于 2013-09-21T05:23:35.117 回答
0

这只是一个猜测,但听起来您可能会在启动程序时覆盖文件。

在您的SaveToFile方法中,开头有以下两行:

StreamWriter writer = new StreamWriter(file);
StreamReader reader = new StreamReader(file);

第一个将创建一个新文件,其名称为file. 如果您不从文件中读取任何内容,则不需要第二个。

现在,如果您在程序的其他地方有类似的代码块在SaveToFile调用该方法之前执行,它将覆盖该文件(并且由于您很可能没有在代码的早期部分中编写任何内容,您'留下一个空白文件)。

为了防止这种情况,我将提供两个建议:

  1. StreamWriter在您要写入文件时创建。任何其他时间您创建一个StreamWriter,您将覆盖现有文件。

  2. 如果您不想覆盖文件,可以使用构造函数的重载,该构造函数采用第二个参数(布尔值)来指示是否将新数据附加到文件中:

    StreamWriter writer = new StreamWriter(file, true);

此外,我建议了解和使用using块,因为这将为StreamWriter您关闭和刷新(及其底层流),即使发生异常并且未处理:

private void SaveToFile(List<Client> records, string file)
{

    try
    {
        AddMember();

        // If you don't want to append but overwrite, use:
        // using (StreamWriter writer = new StreamWriter(file))
        using (StreamWriter writer = new StreamWriter(file, append))
        {

            for (int i = 0; i < records.Count; i++)
            {
                writer.WriteLine(records[i].WriteToFile());
            }
        }
    }
    catch (IOException z)
    {
        MessageBox.Show("Error" + z);
    }
}
于 2013-09-21T05:48:46.453 回答