Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用BinaryReader读取DAT文件#_C#_Binaryfiles - Fatal编程技术网

C# 在C中使用BinaryReader读取DAT文件#

C# 在C中使用BinaryReader读取DAT文件#,c#,binaryfiles,C#,Binaryfiles,我试图用BinaryReady读取DAT文件,但我遇到了一个异常,不知道为什么。我得到的信息是“无法阅读到流的末尾以外的内容”。我的代码如下所示: private void button1_Click(object sender, EventArgs e) { OpenFileDialog OpenFileDialog = new OpenFileDialog(); OpenFileDialog.Title = "Open File...&qu

我试图用BinaryReady读取DAT文件,但我遇到了一个异常,不知道为什么。我得到的信息是“无法阅读到流的末尾以外的内容”。我的代码如下所示:

private void button1_Click(object sender, EventArgs e)

    {
        OpenFileDialog OpenFileDialog = new OpenFileDialog();
        OpenFileDialog.Title = "Open File...";
        OpenFileDialog.Filter = "Binary File (*.dat)|*.dat";
        OpenFileDialog.InitialDirectory = @"C:\";
        if (OpenFileDialog.ShowDialog() == DialogResult.OK)
        {
            FileStream fs = new FileStream(OpenFileDialog.FileName, FileMode.Open);
            BinaryReader br = new BinaryReader(fs);

            label1.Text = br.ReadString();
            label2.Text = br.ReadInt32().ToString();

            fs.Close();
            br.Close();
        }

我看到一个包含大量信息的特定DAT文件,并希望能够读取它,甚至可能将其放在表格中并绘制数据。但我和C#一起工作已经有一段时间了。因此,如果有人能帮助我,我将非常感谢

BinaryReader
很少是读取外部文件的好选择;它只有在与使用
BinaryWriter
编写文件的代码并行使用时才真正有意义,因为它们使用相同的约定

我想这里发生的事情是,您对
ReadString
的调用试图使用对您的文件无效的约定-具体地说,它将读取一些字节(我想说4,big-endian?)作为字符串的长度前缀,然后尝试读取那么多字节作为字符串。但是,如果文件内容不是这样的话:那么很容易尝试读取胡言乱语,将其解释为一个巨大的数字,然后无法读取那么多字节

如果您正在处理任意文件(与
BinaryWriter
无关),那么您确实需要了解很多关于协议/格式的知识。鉴于文件扩展名是不明确的,我不会从“.dat”中推断出任何东西-重要的是:数据是什么,它来自哪里?。只有有了这些信息,才能在阅读时做出明智的评论


从注释中,以下是一些(未经测试的)代码,可以帮助您开始将内容解析为一个范围:

公共静态YourResultType进程(字符串路径)
{
字节[]超大=空;
尝试
{
int len,偏移量=0,读取;
//为简单起见,将文件读入租用的缓冲区
使用(var stream=File.OpenRead(path))
{
len=已检查((int)流长度);
超大=阵列池共享租金(len);
而(偏移量0)
{
偏移量+=读取;
}
}
//现在处理来自缓冲数据的有效负载
返回流程(新的ReadOnlySpan(超大、0、len));
}
最后
{
if(尺寸过大的是对象)
ArrayPool.Shared.Return(超大);
}
}
私有静态YourResultType进程(ReadOnlySpan有效负载)
=>抛出新的NotImplementedException();//你的代码在这里

哪一行引发异常?(从逻辑上讲,你应该在关闭流之前关闭读卡器。)P.P.S.因为我们不知道文件格式,也不知道它是如何创建的,所以任何人都很难具体说明你应该做什么,或者你是否可以让它工作。如果您提供更多详细信息,我们可能会提供更好的帮助。错误出现在'label1.text=br.ReadString();'您正在读取的文件是二进制文件还是文本文件?我不确定
ReadString()
是如何实现的,但是如果我看到一个二进制读取器读取一个字符串,我会假设它一直读取,直到找到一个00字节。你能给出你试图阅读的文件的内容吗,或者至少给出超过Int32的内容吗?注释不用于扩展讨论;这段对话已经结束。