【问题标题】:fgetc alternative in c# [closed]c# 中的 fgetc 替代方案 [关闭]
【发布时间】:2013-08-01 16:00:15
【问题描述】:

我目前正在为我玩的游戏开发演示文件解析器。我一直在查看 PHP 中给出的格式和示例(试图将其转换为 C#),但它使用 fgetc,据我所知,它在 C# 中不可用,只有 C++ 可用。有什么想法可以解决这个问题吗?我试过使用StreamReader.Read(),但它不喜欢空值。

如果有人想查看完整的脚本以更好地了解我想要实现的目标,可以在 here 找到该示例。

谢谢!

【问题讨论】:

  • 你说“它不喜欢空值”是什么意思?
  • 会抛出异常

标签: c# php fgetc


【解决方案1】:

您需要使用BinaryReader 来读取该文件。要阅读int,您可以致电ReadInt32。要读取它们的字符串,您需要逐字节读取 ReadByte 并与 0 进行比较。

using (var fs = File.OpenRead(filename))
{
    using (var reader = new BinaryReader(fs))
    {
        // reading happens here
    }
}

私有字符串 ReadString(BinaryReader 阅读器) { 字节 b; StringBuilder sb = new StringBuilder(); 而 ((b = reader.ReadByte()) != 0) { sb.Append((char)b); } 返回 sb.ToString(); }

我在转换代码时犯了一个错误。文件格式表明该字符串的长度为 260 个字符。所以你需要读取 260 个字节然后修剪字符串,像这样:

private string ReadString(BinaryReader reader, int length = 260)
{
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < length; ++i)
    {
        byte b = reader.ReadByte();
        sb.Append((char)b);
    }
    return sb.ToString().Trim();
}

要阅读标题,你会写:

string hldemo = ReadString(reader, 8);

读取主机名,例如:

string host = ReadString(reader);

我认为这几乎是 php 代码的完全相同的副本。查看其他字符串长度的格式文档,并查看它们的示例代码。我可能错过了什么。

【讨论】:

  • 我第一次调用它时效果很好,第三次调用它时,它没有返回任何东西,任何想法为什么会这样? - pastebin.com/kPDfv5Qi
  • @user1522379:你是说它没有从方法调用中返回,还是返回一个空字符串?有没有看数据看那个位置有没有空字符串?
  • 它返回一个空字符串,我在PHP版本上使用了相同的文件并且它正确返回了值!这是该文件的一个示例(我已将其拆分为单独的行,以便您可以看到有多少空值!)gyazo.com/eb309812597cac046d6177bf3d73a3bd.png
  • @user1522379:查看我的更新。我误读了格式文档,所以我的代码是错误的。
  • 你忘了给 b 赋值 - b = reader.ReadByte();感谢您的帮助,它运行良好!
猜你喜欢
  • 2012-10-08
  • 2010-10-11
  • 2017-03-23
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 2013-04-04
相关资源
最近更新 更多