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

时间:2018-07-17 17:33:21

标签: c# vtk streamwriter writetofile binarywriter

您可以想象我正在向您提出问题,因为我无法通过研究解决问题。而且我还没有经验,所以也许你可以帮忙。

在工作中,我有一个模拟程序,该程序会产生大量数据,因此我想每次使用二进制将其增量记为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处于Append-Mode模式,它也会覆盖我的标头,并且当我想要关闭它并编写另一条ASCII行时,它告诉我它无法访问已经关闭的文件。 那么,有没有针对我的方法的解决方案,或者甚至还有一种更复杂的方式来处理此类输出?

非常感谢您

RR

2 个答案:

答案 0 :(得分:0)

您可以简单地将ascii字符串转换为二进制并将其这样写入文件:

ByteArray = Encoding.XXX.GetBytes(text)

XXX是您想要的编码

BinaryWriter.Write(ByteArray)

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

答案 1 :(得分:0)

您错过了usingStreamWriter的{​​{1}}。像这样更改您的代码,它将起作用:

BinaryWriter

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

string