我正在将一些生成二进制文件的旧C代码移动到我们的C#系统中。问题是,生成的二进制文件仍然需要被另一个旧的C程序读取。
原始代码将几个结构输出到二进制文件,其中许多结构包含链接列表,带有* next指针。
如何在C#中编写这些内容,以便原始程序仍能读取它们?
旧的C代码一次读取和写入整个结构的文件,包括freads和fwrites,即
fread ( &file, sizeof ( struct file_items ), 1, hdata.fp );
我找不到关于fwrite如何输出指针等的大量信息。
答案 0 :(得分:4)
如果旧代码正在编写指向文件的指针,那么你很难处理编写得很糟糕的代码。那些指针对于读取该文件的任何其他进程都没有意义......
此外,使用单个fread()读取整个结构是一个坏主意,因为不同的编译器可能会以不同方式填充这些结构(因此,一个应用程序编写的结构可能与另一个应用程序读取的结构不同)。
答案 1 :(得分:3)
如果您的代码依赖于读取和写入文件的指针值,那么它就会被破坏。每次运行程序时,内存布局都可能略有不同。
不是编写指针,而应该在写入时将指针转换为文件偏移量,并将文件偏移量转换回读取指针。
(这适用于C,C ++和C#)
答案 2 :(得分:1)
用C或任何其他语言阅读后,指针将毫无意义。我假设读取后重建指针结构。这意味着您可以在阅读/写作时将它们视为填充物。
在.NET中,流只接受byte
和byte[]
作为数据类型,因此您必须将结构转换为该格式或从该格式转换。
一种方法是编写自定义代码,按顺序读取/写入字段。给你最大的控制权,但这是很多工作。
另一种方法是将你的结构映射到byte []批发,我会找一个例子。
答案 3 :(得分:0)
你可以(正确地)将指针写入磁盘的唯一方法是使用based addressing之类的东西:
包含的链接列表 基于指针的指针可以是 保存到磁盘,然后重新加载到 在记忆中的另一个地方,与 指针仍然有效。
在C#中处理它将非常困难,并且在序列化期间需要某种映射层。
答案 4 :(得分:0)
指针指的是一个内存位置,当你将一个指针存储在一个文件中时,它是没有意义的,它指的是短暂的东西。因此,要么在此应用程序中无关紧要,因为引用的数据已被丢弃,或者您没有正确说明格式。通常在这种情况下,您将应用“序列化”,以便指向的数据也以这样的方式存储在文件中,即原始数据及其指向的内容可以在以后重建(“反序列化”)
C和C#中的文件存储没有根本区别 - 这与语言无关,但是结构打包可能存在差异,所以只存储结构总是一个坏主意(结构打包甚至可以在C之间变化)编译器)。当然,您还需要意识到C#中的char
类型是16位而不是8.您需要让现有存储格式成为规范,然后使用序列化在C#中实现它以避免差异问题在结构实施中。