您可以想象我正在向您提出问题,因为我无法通过研究解决问题。而且我还没有经验,所以也许你可以帮忙。
在工作中,我有一个模拟程序,该程序会产生大量数据,因此我想每次使用二进制将其增量记为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
答案 0 :(得分:0)
您可以简单地将ascii字符串转换为二进制并将其这样写入文件:
ByteArray = Encoding.XXX.GetBytes(text)
XXX是您想要的编码
BinaryWriter.Write(ByteArray)
打开文件时,它将尝试使用ascii对其进行解码,并且您的ascii字符串将在那里供您阅读
答案 1 :(得分:0)
您错过了using
和StreamWriter
的{{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