如何在 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
StreamWriter
和 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
}
您也可以将 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
}
正如您想象的那样,我正在向您提出问题,因为我无法通过研究解决我的问题。另外我比较没有经验所以也许你可以帮忙。
在工作中,我有一个模拟程序会产生大量数据,所以我想使用二进制将每次增量写为 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
StreamWriter
和 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
}
您也可以将 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
}