如何将数组保存到 C++ 中的文件中?

Posted

技术标签:

【中文标题】如何将数组保存到 C++ 中的文件中?【英文标题】:How to save an array into a file in C++? 【发布时间】:2017-12-27 18:16:57 【问题描述】:

我创建了一个程序,将数组保存到文件中,然后读取文件以在屏幕上显示数组。这是代码

#include <iostream>
#include <fstream>
using namespace std;

int main(void)

    int saveSize = 5;//size of the array
    int save [saveSize + 1] = saveSize, 7, 1, 2 ,3, 4;  //creating an array which first element is his own size
    ofstream fileWrite; fileWrite.open ("File.dat", ios::out | ios::binary | ios::trunc);
    fileWrite.write((char *) &save, sizeof(save));  //saves the array into the file
    fileWrite.close();

    int sizeLoad;  //size of the array that will be loaded
    ifstream fileRead; fileRead.open("File.dat", ios::in | ios::binary);
    fileRead.read((char *) &sizeLoad, sizeof(int));  //it only reads the first element to know the size of the array
    int load[sizeLoad+1];  //creating the array
    fileRead.read((char *) &load, sizeof(int));
    fileRead.close();

    //showing the array
    for(int i = 1; i <= sizeLoad; i++) cout << "Element " << i << ": " << load[i] << endl;

    return 0;

问题是当我运行程序时,结果是这样的:

元素 1:2686224

元素 2:1878005308

元素 3:32

元素 4:2686232

元素 5:4199985

甚至没有接近。有人知道为什么会这样吗?

【问题讨论】:

int load[sizeLoad+1]; 之类的东西不是有效的 C++。不要使用数组,使用 std::vector。 强烈推荐阅读:***.com/questions/46991224/…! 您可能应该只使用&lt;&lt;&gt;&gt; 来写入和读取文件,而不是将数组视为char* - 它更简单且不易出错。 请注意,ofstream fileWrite; fileWrite.open (...); 可以更简单地写成ofstream fileWrite(...);。这就是构造函数的用途。此外,ofstream 的析构函数会关闭文件,因此不需要调用 fileWrite.close()fileRead 也一样。 【参考方案1】:
fileRead.read((char *) &sizeLoad, sizeof(int))
fileRead.read((char*)&load, sizeof(int));

你读到sizeLoad 是 5。

第二行你打算读取5个整数,因此应该改为

int load[sizeLoad];
fileRead.read((char*)&load, sizeLoad * sizeof(int));

您还需要更改循环,只需从0 转到sizeLoad

for(int i = 0; i < sizeLoad; i++) 
    cout << "Element " << i << ": " << load[i] << endl;

您也可以使用std::vector,这样您就不必提前保存项目数。您可以一次读取一个整数并使用std::push_back 将元素添加到数组中。示例:

#include <iostream>
#include <fstream>
#include <vector>

int main()

    std::vector<int> save =  7, 1, 2, 3, 4 ;
    std::ofstream fileWrite("File.dat", std::ios::binary | std::ios::trunc);
    fileWrite.write((char*)save.data(), save.size() * sizeof(int));
    fileWrite.close();

    std::ifstream fileRead("File.dat", std::ios::binary);
    std::vector<int> load;
    int temp;
    while(fileRead.read((char*)&temp, sizeof(int)))
        load.push_back(temp);
    fileRead.close();

    for(int i = 0; i < load.size(); i++) 
        std::cout << "Element " << i << ": " << load[i] << std::endl;

    return 0;

【讨论】:

哇,这正是我想要的,而且更简单......谢谢! :D【参考方案2】:

我更改了您的代码,并且可以正常工作。尝试关注;

int saveSize = 5;   //size of the array
int save[saveSize + 1] = saveSize, 7, 1, 2 ,3, 4;  //creating an array which first element is his own size
ofstream fileWrite("File.dat", ios::out | ios::binary | ios::trunc); 
fileWrite.write(reinterpret_cast<char*>(&save), sizeof save );  //saves the array into the file
fileWrite.close();

int sizeLoad[saveSize+1];  //size of the array that will be loaded
ifstream fileRead("File.dat", ios::in | ios::binary);
fileRead.read(reinterpret_cast<char*>(&sizeLoad), sizeof sizeLoad );  //it only reads the first element to know the size of the array
fileRead.close();

//showing the array
for(int i = 0; i < (sizeof(sizeLoad)/sizeof(sizeLoad[0])); i++) 
    cout << "Element " << i + 1 << ": " << sizeLoad[i] << endl;

return 0;

编辑:我试图解释不清楚的部分。在 3.line 中创建了“.dat”文件,下一行将数组中的每个数字放入该文件。 ofstream.write 函数有两个参数,第一个参数应该是字符,所以我将数组转换为 char,第二个参数应该是数组的大小(您将写入多少个字符)。在您的情况下,您的数组包含 6 个数字,数组大小为 24(每个 int 值 4 个字节)。在将数组写入控制台时,您需要知道数组的大小,因此我只需将数组大小 (24) 划分为 1 个数组字符 (4)。抱歉我的解释不好,感谢您的谨慎。

【讨论】:

哦,谢谢!我不太了解您的几行代码,但我会尝试弄清楚它们是做什么的。 这不是一个完整的答案。你需要解释你改变了什么以及你为什么改变它。也没有正确复制询问者代码的意图。它可以编译并运行,但做的事情略有不同。【参考方案3】:

你已经阅读了一个元素,

fileRead.read((char *) &load, sizeof(int));   // load[0] was read

没有打印出来

    for(int i = 1; i <= sizeLoad; i++) cout << "Element " << i << ": " << load[i] << endl;

您应该使用

读取完整的数组
int load[sizeLoad];  //creating the array
fileRead.read((char *) &load, sizeof(load));

并以这种方式打印所有元素

   for(int i = 0; i < sizeLoad; i++) cout << "Element " << i << ": " << load[i] << endl;

【讨论】:

每三个带有标签 c++ 的代码在此页面上使用 VLA,但只有我被否决了。 “这似乎是正确的” - 不,它似乎不正确(它不是 C++) - 因此被否决了。 “在这个页面上,每三个带有标签 c++ 的代码都使用 VLA,但只有我被否决了。” - 废话。 @Duke 如果您想限制可移植性,您“被允许”使用它们,但这个问题被标记为 C++,而不是 GCC。

以上是关于如何将数组保存到 C++ 中的文件中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中的“.bin”文件中编写结构数组?

如何将 List<> 数组中的数据保存到文本文件(C#)?

关于c++文件流读入和写入的问题

如何将文本文件中的一行的子字符串保存到字符串数组中?

将目录中的文件名添加到 char* 数组。 C++

将浮点数组写入和附加到 C++ 中 hdf5 文件中的唯一数据集