gpt4 book ai didi

c++ - 读取/写入我自己的Vector实现文件以进行作业-ifstream.read(),是否有必要将char *转换为int,如果是,如何进行转换?

转载 作者:行者123 更新时间:2023-11-30 05:13:54 24 4
gpt4 key购买 nike

我在那儿尽了最大的努力提供了一个内容丰富的标题,如果时间太长,我很抱歉。
我正在使用C++在OOP上为CIS类分配作业。对于此类,通常需要实现提供的 header ,而不对其进行修改或使用#include编码任何其他库。当前的分配是将void Read(std::ifstream&)void Write(std::ofstream&)函数添加到我们为先前分配实现的Vector类中。
要求是:

  • 必须以二进制模式打开所有文件。
  • 写函数必须将类型T的内部数组写入文件
  • 读取功能必须将文件读入类型T的数组中。

  • 从输入文件中读取的数组未指定要执行的操作。我的假设是将返回一个引用,但是 read()的返回类型在赋值中指定为 void。我最好的猜测是,我的教授只是对让我们展示读取数组的能力感兴趣,所以这就是我的目标。我还考虑过将输入文件的数组连接到任何调用read()的 vector 对象的末尾,但是我认为这并不重要,所以我离题了。
    我相信我已经把write()放在了坚实的位置。这就是我目前正在使用的内容:Write()已失败,我将在代码之后进行解释:
    306 template <class T> void Vector<T>::Write (std::ofstream& ofile) const                                                                                                                                                                    
    307 {
    308 if (!ofile.is_open()) ofile.open("vector.bin", std::ios::trunc | std::ios::binary);
    309
    310 if (ofile.is_open())
    311 {
    312 ofile.write((char*)&m_array, sizeof(m_array));
    313 } else throw -6;
    314
    315 ofile.close();
    316 }
    当write()运行时,它不会出错,但是会在输出文件中写入很不正确的内容。假设m_array包含{2,8,16,4}。输出文件将包含:
    01000000 00010000 00001000 00100000
    什么时候应该包含(假设sizeof(int)为4,我知道我不应该假设,但是您明白了):
    01000000 00000000 00000000 00000000
    00010000 00000000 00000000 00000000
    00001000 00000000 00000000 00000000
    00100000 00000000 00000000 00000000
    似乎当我将m_array转换为char *时,我的计算机正在变聪明,并且意识到数字4表示的char不需要占用4个字节来存储。
    我在工作中遇到了一些类似的问题:
    void* temp = m_array;
    char* buffer = (char*)temp;
    这似乎有助于编译器忘记m_array中的4个字节实际上代表一个元素。感觉太丑了,我觉得必须有一种合理的方法来做到这一点,否则就不会在C++入门类中进行分配。
    无论如何,我遇到的问题是读取功能。如果我是正确的,那么根据此分配实现的 vector 对象将只能从该特定对象写入的文件中读取。如果编写用于读取int的算法试图从Vector写入的文件中读取数据,那只会造成垃圾,对吗?这是我面临的最大挑战之一,即编写一种算法,该算法将能够从文件中读取到类型为T的数组中,而与表示T所需的实际字节数无关。
    我现在走的路是执行以下操作:
    T temp;
    char* buffer = new char[sizeof(T)];
    // Loop the following for the entire file
    ifile.read(buffer, sizeof(T));
    temp = T(*buffer); // I know this won't work, this is what I'm trying to get at
    如果我正确理解,这将使我能够将正确数量的字节读入char数组。例如,如果将 int的错误写入文件中,它将读取两个字节并将其存储在 char的数组中,长度为2个字节。然后,我的缓冲区变量将完全包含我想要的数据。
    我该如何将这些数据放入temp!?!?
    我在这里疯了,特别是因为我知道atoi可以很好地工作,或者至少值得进行一些调查。我认为这不会解决我为任何原始数据类型工作的问题,但这至少是一个开始。我要拔头发是因为我有两个字节的数组,如果将它们放在一起,我将拥有想要的int,但我只是想不通如何将它们放在一起。我会以错误的方式处理吗?这是尝试从二进制文件读取的一种荒谬方法吗?
    我可以做类似 temp = *(int*(buffer))的事情吗?这对我来说似乎很丑陋,我宁愿了解正确的做事方式,也不愿尝试每个疯狂的主意,直到编译完成为止。
    非常感谢您阅读我的沙拉。

    最佳答案

    在处理二进制数据时,我倾向于使用memcpy / memmove。要回答您的问题:

    T temp;
    char* buffer = new char[sizeof(T)];

    // Loop the following for the entire file
    ifile.read(buffer, sizeof(T));
    //Put binary data into temp var
    std::memcpy(&temp, buffer, sizeof(T));

    为了获得更优雅的解决方案,我将使用一种C结构,您可以通过一个操作直接在文件中进行读写操作:
    typedef struct vector_s {
    uint32_t bytesPerElement;
    uint32_t numberOfElements;
    char data[1]; //Structure hack works because its the last element.
    } vector_t;

    然后玩C结构技巧: Is the "struct hack" technically undefined behavior?

    关于c++ - 读取/写入我自己的Vector实现文件以进行作业-ifstream.read(),是否有必要将char *转换为int,如果是,如何进行转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43678488/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com