我正在试着写一个将学生记录保存在二进制文件中的程序。当我写入多条记录时,它只显示最后写入的记录。如何显示比上一条记录更多的内容?这与我输入信息的方式有关吗?
发布于 2014-12-09 09:32:38
所显示的代码存在多个问题。
1) std::string不是数组。当您将std::string写入文件时,最终发生的只是在std::string结构中写入原始二进制指针,或多或少,这些指针指向堆上实际动态分配的内存,其中实际字符串的内容位于写入文件的原始进程中。
把std::string想象成一个指针。string对象管理指针,并负责为其分配内存。它实际上比指针复杂一点,但为了讨论的目的,它只是一个指针。所以,当你有了:
char *p;
in.write(&p, sizeof(p));你最终要做的不是写实际的字符串,不管它是什么,而是p指向的内存地址。因此,如果实际指针p的值是内存地址0x40823f0e (只是某个随机的内存位置),那么您最终会将此内存地址写入文件(4或8字节,取决于您正在编写的是32位平台)。
您不能只是将std::strings s读/写到一个文件中。最终写入文件的都是毫无意义的二进制垃圾,一旦读入,在完全不同的读取过程中就不太可能有任何意义。最好的结果就是你会得到无意义的结果。最坏的(也是最有可能的)结果是内存损坏和崩溃。
你应该知道的一件事是sizeof()总是一个常量,它是由编译器计算出来的。这段代码总是以向文件写入固定数量的字节结束,对吗?
因此,停下来想一想:您正在使用sizeof()向文件写入固定数量的字节。当此结构中的std::string可能只有几个字符或一百万个字符时,这对您来说有意义吗?std::string中的字符数没有固有限制。它只受可用内存的限制。
2) create()在文件中写入一个空结构。在提示输入其内容之前。通常,您首先希望填充一些结构,然后将其写入一个文件。而不是反过来。
3) display()用ios::out打开文件。这是为了写作。打开一个要写入的文件,然后尝试从它读取,不会产生有用的结果。
https://stackoverflow.com/questions/27369835
复制相似问题