【问题标题】:How to write Binary and ASCII to the same txt-file in c#?如何在 c# 中将二进制和 ASCII 写入同一个 txt 文件?
【发布时间】:2018-12-25 12:04:35
【问题描述】:

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

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

    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 初始化文件以覆盖可能存在的旧文件,然后写入标题部分。关闭文件后,使用 FileMode.Append 再次打开它并写入我的二进制数据。我想重复这一点,直到我想写出的所有字段都包含在 vtk 文件中。

问题是:BinaryWriter 会覆盖我的标题,即使它处于附加模式,当我想关闭它并编写另一个 ASCII 行时,它告诉我它无法访问已经关闭的文件。 那么我的方法是否有解决方案,或者是否有更复杂的方法来处理此类输出?

非常感谢您,

RR

【问题讨论】:

标签: c# vtk streamwriter writetofile binarywriter


【解决方案1】:

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

ByteArray = Encoding.XXX.GetBytes(text)

XXX 是你想要的编码

BinaryWriter.Write(ByteArray)

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

【讨论】:

    【解决方案2】:

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

    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
    }
    

    您还可以将您的标头编码为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
    }
    

    或者直接用BinaryWriterstring

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

    【讨论】:

      猜你喜欢
      • 2014-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      相关资源
      最近更新 更多