C# 结构-初始化并写入文件 < >我把一些代码从C++转换成C语言作为学习C语言的方法。在我的C++代码中,我有< /P> struct ChArray{ char ch[8]; }; bool operator < (const ChArray& arrA, const ChArray& arrB); struct ChArray{ char-ch[8]; }; 布尔运算符 map<ChArray, double>::iterator s; for(s = settings.begin(); s != settings.end(); s++){ out.write(reinterpret_cast<const char*>(&s->first), sizeof(ChArray)); } map::迭代器s; 对于(s=settings.begin();s!=settings.end();s++){ out.write(reinterpret_cast(&s->first),sizeof(ChArray)); }

C# 结构-初始化并写入文件 < >我把一些代码从C++转换成C语言作为学习C语言的方法。在我的C++代码中,我有< /P> struct ChArray{ char ch[8]; }; bool operator < (const ChArray& arrA, const ChArray& arrB); struct ChArray{ char-ch[8]; }; 布尔运算符 map<ChArray, double>::iterator s; for(s = settings.begin(); s != settings.end(); s++){ out.write(reinterpret_cast<const char*>(&s->first), sizeof(ChArray)); } map::迭代器s; 对于(s=settings.begin();s!=settings.end();s++){ out.write(reinterpret_cast(&s->first),sizeof(ChArray)); },c#,c++,C#,C++,问题是在C#中完成同样的事情需要什么 不是地图部分(我知道使用字典),而是如何创建一个可以轻松写入和读取文件的集合大小的结构 我尝试过几种组合,都会导致一些错误,这似乎会在以后的写作中引起问题 例如,在一个结构中,我不能定义默认大小,这意味着我必须使用新来动态分配内存,这意味着(对于我来说,作为C++程序员),当读取文件时,没有准确的方法来保证结构的大小,因为在初始化结构时,动态分配可以是任何内容 也许我只是不知道有什么c#power可以解决这个问题。我认为可以使用类ChArray而不是结构Ch

问题是在C#中完成同样的事情需要什么

不是地图部分(我知道使用字典),而是如何创建一个可以轻松写入和读取文件的集合大小的结构

我尝试过几种组合,都会导致一些错误,这似乎会在以后的写作中引起问题

例如,在一个结构中,我不能定义默认大小,这意味着我必须使用新来动态分配内存,这意味着(对于我来说,作为C++程序员),当读取文件时,没有准确的方法来保证结构的大小,因为在初始化结构时,动态分配可以是任何内容


也许我只是不知道有什么c#power可以解决这个问题。

我认为可以使用类ChArray而不是结构ChArray 在您的默认构造函数中,您可以分配一个大小为8的字符数组。

C#例如,提供了
BinaryReader
BinaryWriter
,允许您在文件中读取和写入字节数组

我相信你的问题是,你尝试把C++转换成C代码太低的级别,Syrimo涉及到

<>编辑:也许我误解了你,但是如果你想直接把C++代码转换成C代码,那么使用下面的结构:
class Ch8Array
{
    public byte[] ch = new byte[8];
}
以及通过以下方式进行读/写操作:

Ch8Array arr = new Ch8Array();

using (BinaryReader reader = new BinaryReader(File.Open("test", FileMode.Open))) {
    reader.Read(arr.ch, 0, arr.ch.Length);
} 

using (BinaryWriter writer = new BinaryWriter(File.Open("test2", FileMode.Create))) {
    writer.Write(arr.ch);
}   

(为了清楚起见,我省略了映射部分)

我建议您尝试在C#中的更高级别上工作。特别是如果你想了解这门语言。C#用一些低水平的能力换取大幅提高的生产率。接受这一点


你想要的东西可以直接用C语言翻译。或者,可以使用
StructLayoutAttribute
为结构和控件成员布局设置固定大小。C#非常支持不安全代码。这通常用于与原生API的互操作。< /p>嗯,C++不是相同的吗?但问题是,如果我为一个对象的结构分配了9位,为另一个对象分配了7位,那么我怎么知道在这些大小下读取它呢?是的,我可以使用常量,但归结起来,用C++一个数字决定读写大小。C#可以不同,因为数字可以存在于多个地方。同样,如果框架不同,它只是知道,那就太好了。(我很确定它不会)但是有这样一个潜在的变量,它看起来很危险。我想我可以使用构造器,但我正在增加我的结构大小,这不是很多,但这样做似乎是不好的编码。你的目标是什么?您想将ChArray的数据写入文件并稍后从文件中读取,对吗?因此,在C#中,您可以将对象写入文件并从文件中读取。你必须实现ISILIALIALITY和ORACLE 2方法来完成这一点。嗯,我不喜欢它,因为C++版本要简单得多,但是哦。因为我必须这样做,所以我创建了一个完整的类,包括构造函数、隐式重载和ToString重载,这样我就可以将每个类作为变量使用。谢谢你的帮助。好吧,最终这在很大程度上取决于你想用它做什么。C#通常允许您用更少的代码编写相同的功能,因为它有更大的库支持。但是,这只会帮助你,如果你从开始使用库,而不是尝试逐行翻译C++代码(这或多或少是我在答案中所做的),那么我就可以正确地理解你的需求:你只想把8字节写入二进制文件?所以
out.write(s->first.ch,sizeof(s->first.ch))
也能纠正这个错误吗?@MikeMB,这样行吗?这是可行的,但如果我必须动态分配,我不会得到指针的大小,而不是有多少个字符的大小吗?但是,我们又回到了保证大小为一个数字的问题上。因为ch是一个固定大小的数组,是的,只要char的大小是一个字节,它就可以工作-我不确定这是否在标准中定义。以下内容可能更健壮:
out.write(s->first.ch,sizeof(s->first.ch)/sizeof(s->first.ch[0])