如何在 C# 中将二进制和 ASCII 写入相同的 txt-file?

How to write Binary and ASCII to the same txt-file in c#?

正如您想象的那样,我正在向您提出问题,因为我无法通过研究解决我的问题。另外我比较没有经验所以也许你可以帮忙。

在工作中,我有一个模拟程序会产生大量数据,所以我想使用二进制将每次增量写为 VTK 文件。由于获取数据的原因,我想自己实现这个vtkWrite。 因此,您可能知道,我需要在 ASCII-format 中写一些行,其中包含我需要以二进制格式编写的数据部分的声明。 到目前为止,我的代码如下所示:

    public void WriteVTKBin(int increment, string output_dir, bool format)
    {
        int data_structure = 12;
        int[,] ElementTypes = new int[hex8Elements.numberOfElements, 1];
        for (int ii = 0; ii < ElementTypes.Length; ii++) ElementTypes[ii, 0] = data_structure;
        string File_name = "output_bin_" + increment + ".vtk";
        var output = new FileStream(@output_dir + "/" + File_name, FileMode.Create);
        var output_Stream = new StreamWriter(output);
        using (output)
        {
            output_Stream.WriteLine("# vtk DataFile Version 3.0");
            output_Stream.WriteLine("vtk-Output for increment");
            if (format) output_Stream.WriteLine("BINARY");
            else output_Stream.WriteLine("ASCII");
            output_Stream.WriteLine("DATASET UNSTRUCTURED_GRID");
            output_Stream.WriteLine("POINTS " + nodes.numberOfNodes + " double");
        }
        var output_rest = new FileStream(@output_dir + "/" + File_name, FileMode.Append);
        var BinWriter = new BinaryWriter(output_rest);
        using (output_rest)
        {
            BinWriter.Write(GetBytesDouble(GetPointsOutput()));
        }
    }
 }

取自 BinaryWriter 的参数是我使用不同方法生成的 ByteArray。 我的想法是用 FileMode.Create 初始化文件以覆盖可能存在的旧文件,然后写入 header 部分。关闭文件后,使用 FileMode.Append 再次打开它并写入我的二进制数据。我想重复此操作,直到我要写出的所有字段都包含在 vtk-file 中。

问题是:BinaryWriter 覆盖了我的 header,即使它在 Append-Mode 中,当我想关闭它并写入另一个 ASCII-line 时,它告诉我它无法访问一个已经关闭的文件。 那么我的方法是否有解决方案,或者是否有更复杂的方法来处理此类输出?

非常感谢您,

RR

您可以简单地将您的 ascii 字符串转换为二进制并将它们写入文件:

ByteArray = Encoding.XXX.GetBytes(text)

其中 XXX 是您想要的编码

BinaryWriter.Write(ByteArray)

当您打开文件时,它会尝试使用 ascii 对其进行解码,您的 ascii 字符串将在那里供您阅读

您错过了 using StreamWriterBinaryWriter。像这样更改您的代码,它将起作用:

using (var fstream = new FileStream(..., FileMode.Create))
using (var writer = new StreamWriter(fstream))
{
    // Write headers
}

using (var fstream = new FileStream(..., FileMode.Append)
using (var writer = new BinaryWriter(fstream))
{
    // Write binary data
}

您也可以将 headers 编码为 byte[] 并仅使用 BinaryWriter

using (var fstream = new FileStream(..., FileMode.Create)
using (var writer = new BinaryWriter(fstream))
{
    // Write headers
    writer.Write(Encoding.ASCII.GetBytes("..."));

    // Write binary data
}

或者直接用BinaryWriter写成string.

using (var fstream = new FileStream(..., FileMode.Create)
using (var writer = new BinaryWriter(fstream))
{
    // Write headers
    writer.Write("...");

    // Write binary data
}