【问题标题】:Reading and Writing from a txt file?从txt文件读取和写入?
【发布时间】:2013-01-03 02:51:46
【问题描述】:

我正在用 c# 创建一个游戏,但我遇到了一个问题。我希望我的游戏将窗帘标签保存到 txt 文件中,这里举个例子:

Label1.Text = "Character Name: "
Label2.Text = "Level: "
Label3.Text = "Exp: "

现在我想做的是从 txt 文件中检索“字符名称:[名称]”?但我也想在退出游戏时将名称保存到 txt 文件中。所以这里可能是一个更好的例子:

我想从 txt 文件中检索级别:[LVL],当玩家完成并退出我的游戏时,我希望它用新级别覆盖现有的行?

我想我需要使用StringReaderStringWriter

【问题讨论】:

  • 对于真正简单的 I/O,请尝试使用 System.IO.File 类 ( msdn.microsoft.com/en-us/library/system.io.file.aspx ),尤其是它的 ReadAllTextWriteAllText 方法。一旦你明白了这一点,你可能会考虑以不同的方式做事,或者至少继续跟踪何时读/写以及如何重新加载游戏。请务必将保存/加载抽象到程序的单独部分,以便您可以根据需要随意更改它。
  • 我已经从问题中删除了所有类型的“感谢信”/“不知道如何使用示例”...请添加您无法正常工作的代码。旁注:考虑使用 Xml,因为它可能更容易从中读取结构化数据。
  • 谢谢我试一试我只需要一个代码来读取,就像我环顾四周的示例代码一样,但我找不到一个,因为我在注销代码时是盲人,我只有在我的孩子出生前 6 个月让这个游戏开始运行:/
  • 或者您可以简单地在关闭时序列化所有内容,并在打开时反序列化它们msdn.microsoft.com/en-us/library/4abbf6k0.aspx

标签: c# stringwriter stringreader


【解决方案1】:

这是一个使用 XML 序列化和数据模型的快速示例。确保文件顶部有 using System.Xml.Serialization; 命名空间导入行。

将您希望保存/加载的数据声明为一个简单的类,例如:

public class SaveData
{
    public string CharacterName { get; set; }
    public int Level { get; set; }
    public int Experience { get; set; }
}

当您要保存时,构建该数据模型:

SaveData saveState = new SaveData()
{
    CharacterName = myCharacter.Name,
    Level = myCharacter.Level,
    Experience = myCharacter.Experience
};

要保存到文件,请使用XmlSerializer 类并打开文件流以将其序列化为:

public void SaveStateToFile(SaveData state)
{
    XmlSerializer serializer = new XmlSerializer(typeof(SaveData));
    using (TextWriter writeFileStream = new StreamWriter(@"C:\savefile.xml"))
    {
        serializer.Serialize(writeFileStream, state);
    }
}

这将创建一个包含以下内容的 xml 文件,例如:

<?xml version="1.0" encoding="utf-8"?>
<SaveData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <CharacterName>John</CharacterName>
  <Level>10</Level>
  <Experience>9001</Experience>
</SaveData>

所以如果需要的话应该很容易编辑。加载数据:

public SaveData LoadStateFromFile()
{
    XmlSerializer serializer = new XmlSerializer(typeof(SaveData));
    using (FileStream readFileStream = new FileStream(@"C:\savefile.xml", FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        return (SaveData)serializer.Deserialize(readFileStream);
    }
}

这应该会给你一个很好的类型安全数据模型,然后根据需要重新绑定你的 GUI:

SaveData loadedData = LoadStateFromFile();
Console.WriteLine(loadedData.CharacterName); //John
Console.WriteLine(loadedData.Level); //10
Console.WriteLine(loadedData.Experience); //9001

Label1.Text = "Character Name: " + loadedData.CharacterName;
Label2.Text = "Level: " + loadedData.Level;
Label3.Text = "Exp: " + loadedData.Experience;

【讨论】:

  • 哇,非常感谢,这正是我所需要的!你太棒了!如果我可以做任何其他事情来在这个网站上给你一些荣誉,我会,在我的游戏中,我很乐意把你的名字和链接放下,谢谢!
  • 有一个错误是can't find myCharacter.Name, Level = myCharacter.Level or myCharacter.Experience
  • @Terrii 一般来说,无论您在哪里存储该数据,都可以放在那里。我假设您在某个地方有一些存储这些属性的角色对象。
  • 不,您创建自己的角色,然后它会将您发送到主窗口的新表单,然后在启动时加载您选择的用户名,然后您的 lvl = 0,然后您的经验 = 0 然后当你退出我想将该数据保存到一个 xml 文件中我没有字符文件。
  • xml 将在 savefile 中,所以在字符文件中
【解决方案2】:

您可以尝试使用 XML 作为设置文件。这是一个非常简单的例子:

创建一个新的 XML 文件,填入角色名称并保存:

XElement x = new XElement("Settings");
x.Add(new XElement("CharacterName", "John Doe"));
x.Save("1.xml");

加载保存的xml并打印输出:

XElement loaded = XElement.Load("1.xml");
Console.WriteLine(loaded.Element("CharacterName").Value);

这是一篇 MSDN 文章开头:LINQ to XML


如果 .NetFramework 3.5 及更高版本不可用,您可以使用来自 System.Xml 命名空间的类。见

  1. XML in .NET: .NET Framework XML Classes and C# Offer Simple, Scalable Data Manipulation
  2. Manipulate XML data with XPath and XmlDocument
  3. Writing XML with the XmlDocument class

...只是用 C# xmldocument 谷歌。

【讨论】:

  • 我刚刚尝试过,我正在使用 Windows 表单,抱歉我忘记描述了,我正在使用 .net frameworks 3,但它找不到 XElement
  • 我使用控制台应用程序仅作为示例。这确实没有什么区别。 LINQ 最低框架要求是 3.5。但是,您可以将 XmlDocument Class 与 .NetFramework 3 一起使用
  • 我刚读过它们,非常感谢你:) 我使用了这个来源csharp.net-tutorials.com/xml/…
  • @Terrii 很高兴,它帮助了你。
【解决方案3】:

你可以试试SQLite。它是保存在文本文件中的数据库。您将能够比使用自己的纯文本更好地组织数据。

【讨论】:

  • 保存游戏设置太过分了。
【解决方案4】:

另一个选择是使用旧的 INI 文件。这是一个很棒的 An INI file handling class using C# 示例,可以帮助您处理这个问题。这是一个使用它的例子:

像这样创建一个INIFile

INIFile ini = new INIFile("C:\\test.ini");

使用IniWriteValue 将新值写入节中的特定键,或使用IniReadValue 从特定节中的键中读取值。

【讨论】:

    【解决方案5】:

    这是我最终使用的代码,它工作正常:

    XmlDocument xmlDoc = new XmlDocument();
    XmlNode rootNode = xmlDoc.CreateElement("Info");
    xmlDoc.AppendChild(rootNode);
    
    XmlNode userNode = xmlDoc.CreateElement("Username");
    userNode.InnerText = Username.Text;
    rootNode.AppendChild(userNode);
    
    xmlDoc.Save(gameFolder + Username.Text + ".sav");
    

    我使用了来自@Konstantin Vasilcov 的资源

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 2015-06-04
      • 2023-03-06
      • 2013-03-25
      • 2013-02-02
      • 1970-01-01
      相关资源
      最近更新 更多