【发布时间】:2021-02-12 10:34:03
【问题描述】:
我以特定时间间隔从设备获取二维数组。我将这些系列放在一个列表中。我需要将列表中的序列写入计算机上的文件。看完这些系列 我会再次将其放入列表中。我找到了一种方法。我可以写系列。我在阅读时有一些问题。
当我写一个固定的数组时;示例short[,] array2D = new short[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
当我想阅读同一系列知道它的尺寸时,我会正确阅读它。
但是当我连续写多个系列时,我想逐个阅读。我在这方面失败了。如何从文件中读取序列?
编写代码
private void testWriteArray()
{
for (int i = 0; i<Globals.logArrayList.Count; i++)
{
array2D = Globals.logArrayList[i];
FileStream writeStream = new FileStream(filename, FileMode.Append);
BinaryWriter writeBinary = new BinaryWriter(writeStream);
GCHandle arrHandle = GCHandle.Alloc(array2D, GCHandleType.Pinned);
IntPtr arrPtr = arrHandle.AddrOfPinnedObject();
unsafe
{
int arrLen = array2D.Length;
if (arrLen > 0)
{
IEnumerator enumerator = array2D.GetEnumerator();
enumerator.MoveNext();
int arrSize = System.Runtime.InteropServices.Marshal.SizeOf(enumerator.Current) * arrLen;
using (UnmanagedMemoryStream arrStream =
new UnmanagedMemoryStream((byte*)arrPtr.ToPointer(), arrSize))
{
arrStream.CopyTo(writeBinary.BaseStream, (int)arrStream.Length);
}
}
}
arrHandle.Free();
writeStream.Flush();
writeStream.Close();
}
}
阅读代码
static Array testReadArray()
{
int[,] array2D = new int[1000, 2000];
FileStream readStream = new FileStream(filename, FileMode.Open);
BinaryWriter readBinary = new BinaryWriter(readStream);
GCHandle arrHandle = GCHandle.Alloc(array2D, GCHandleType.Pinned);
IntPtr arrPtr = arrHandle.AddrOfPinnedObject();
unsafe
{
int arrLen = array2D.Length;
if (arrLen > 0)
{
IEnumerator enumerator = array2D.GetEnumerator();
enumerator.MoveNext();
int arrSize =
System.Runtime.InteropServices.Marshal.SizeOf(enumerator.Current) * arrLen;
using (UnmanagedMemoryStream arrStream = new UnmanagedMemoryStream
((byte*)arrPtr.ToPointer(), arrSize, arrSize, FileAccess.Write))
{
readBinary.BaseStream.CopyTo(arrStream, (int)arrStream.Length);
}
}
}
arrHandle.Free();
readStream.Close();
return array2D;
}
在阅读代码中,我不知道数组在文件中有多少维。这就是我给数组大小 1000,2000 的原因。通常,虽然我的数据在 0-255 之间,但我在阅读时会阅读 6-7 位数字。
我可以知道文件中字符串的数量吗?如果有怎么办?
【问题讨论】:
-
您可以逐行阅读并从该行中提取数字docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
-
阅读时需要能够确定每个块的大小。如果所有块的大小相同,则没有问题。你阅读直到你得到EOF。如果块的大小不同,则需要在每个块之前指定长度或类型,以便确定块的大小。
-
@TobyB :行不适用于二进制数据。二进制的行尾是什么???除非每个二进制数据块都具有唯一的决定性字符,而不是不是数据的一部分,否则您的解决方案将无法工作。
-
您好,感谢您的cmets。问题很简单,我在下面解释了解决方法。
-
我在每个数据包的开头和结尾都有一个标头。所以我会这样把我读到的数据分块。
标签: c# arrays binaryfiles