c++ 对vector类使用write()函数
时间: 2024-05-13 16:15:57 浏览: 35
`write()`函数是C++标准库中的一个输出函数,用于将指定数据写入指定文件中。对于`vector`类来说,可以通过指针操作将其元素写入文件中。
以下是一个示例代码,假设我们有一个`vector<int>`类型的向量`v`,并且需要将其写入名为`data.bin`的二进制文件中。
```
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {1, 2, 3, 4, 5};
ofstream out("data.bin", ios::binary);
if (!out) {
cerr << "Failed to open file!" << endl;
return -1;
}
out.write((char*)v.data(), v.size() * sizeof(int));
out.close();
return 0;
}
```
在这个示例代码中,我们首先定义了一个名为`data.bin`的二进制文件,并将其设置为输出流。然后,我们使用`write()`函数将`v`向量中的所有元素写入到文件中。这里需要注意的是,我们需要将指向`v`数据的指针转换为`char*`类型。
最后,我们关闭文件流,完成了向二进制文件中写入`vector`数据的操作。
相关问题
c++ 用vector创建的二维数组怎么用cv::FileStorage进行保存
使用OpenCV的`FileStorage`类可以方便地将二维数组存储到文件中。下面是一个示例代码,展示如何使用`FileStorage`类将二维数组保存到文件中:
```c++
#include <opencv2/opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;
int main()
{
vector<vector<int>> arr2d = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
FileStorage fs("arr2d.yml", FileStorage::WRITE);
fs << "arr2d" << "[";
for (const auto& row : arr2d)
{
fs << "{";
for (const auto& element : row)
{
fs << element;
}
fs << "}";
}
fs << "]";
fs.release();
return 0;
}
```
在上述代码中,我们首先定义了一个二维数组`arr2d`,然后使用`FileStorage`类创建一个名为`arr2d.yml`的文件,并将二维数组写入该文件中。在写入过程中,我们首先使用`fs << "["`和`fs << "]"`分别将整个数组包围起来,然后使用`fs << "{"`和`fs << "}"`分别将每一行包围起来。最后,我们使用`fs << element`将每个元素写入文件中。请注意,我们使用了auto类型和范围for循环来遍历行和元素,这使得代码更加简洁和易于理解。
读取二维数组的代码如下:
```c++
vector<vector<int>> readArr2d(string filename)
{
vector<vector<int>> arr2d;
FileStorage fs(filename, FileStorage::READ);
if (!fs.isOpened())
{
cout << "Failed to open file" << endl;
return arr2d;
}
FileNode node = fs["arr2d"];
if (node.empty())
{
cout << "Failed to read node" << endl;
return arr2d;
}
for (FileNodeIterator it = node.begin(); it != node.end(); ++it)
{
vector<int> row;
for (FileNodeIterator it2 = (*it).begin(); it2 != (*it).end(); ++it2)
{
int element;
(*it2) >> element;
row.push_back(element);
}
arr2d.push_back(row);
}
return arr2d;
}
```
在上述代码中,我们首先定义了一个函数`readArr2d`,它接受一个文件名作为参数,并返回读取的二维数组。在函数内部,我们使用`FileStorage`类打开指定的文件,并读取名为`arr2d`的节点。然后,我们使用两个嵌套的循环遍历每一行和每个元素,并将它们存储在一个新的二维数组中。最后,我们返回该数组。
请注意,在上述代码中,我们使用了`FileNodeIterator`类来遍历节点。这是因为节点可以具有任意数量的子节点,因此我们需要一个迭代器来遍历它们。
用c或c++语言,写一个函数将包含vector数组的结构体中的数据读入到文件当中,并从文件中再次次读取数据到相应的结构体
以下是用 C++ 语言实现的代码示例:
```cpp
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
struct MyStruct {
vector<int> vec;
};
void writeToDisk(MyStruct myStruct, string fileName) {
ofstream outFile(fileName, ios::out | ios::binary);
if (outFile.is_open()) {
// Write vector size to file
int vecSize = myStruct.vec.size();
outFile.write(reinterpret_cast<char*>(&vecSize), sizeof(vecSize));
// Write vector elements to file
for (int i = 0; i < vecSize; i++) {
outFile.write(reinterpret_cast<char*>(&myStruct.vec[i]), sizeof(myStruct.vec[i]));
}
outFile.close();
} else {
cout << "Error opening file " << fileName << endl;
}
}
MyStruct readFromDisk(string fileName) {
MyStruct myStruct;
ifstream inFile(fileName, ios::in | ios::binary);
if (inFile.is_open()) {
// Read vector size from file
int vecSize;
inFile.read(reinterpret_cast<char*>(&vecSize), sizeof(vecSize));
// Read vector elements from file
for (int i = 0; i < vecSize; i++) {
int element;
inFile.read(reinterpret_cast<char*>(&element), sizeof(element));
myStruct.vec.push_back(element);
}
inFile.close();
} else {
cout << "Error opening file " << fileName << endl;
}
return myStruct;
}
int main() {
MyStruct myStruct;
myStruct.vec.push_back(1);
myStruct.vec.push_back(2);
myStruct.vec.push_back(3);
writeToDisk(myStruct, "data.dat");
MyStruct newStruct = readFromDisk("data.dat");
for (int i = 0; i < newStruct.vec.size(); i++) {
cout << newStruct.vec[i] << " ";
}
cout << endl;
return 0;
}
```
在这个示例中,我们定义了一个结构体 `MyStruct`,其中包含一个 `vector` 数组。我们通过 `writeToDisk` 函数将 `MyStruct` 写入到文件 `data.dat` 中,然后通过 `readFromDisk` 函数从文件中读取数据并返回一个新的 `MyStruct` 对象。
在 `writeToDisk` 函数中,我们首先打开文件,并将 `vector` 数组的大小写入文件。然后,我们逐个将 `vector` 数组中的元素写入到文件中。在 `readFromDisk` 函数中,我们打开文件并读取 `vector` 数组的大小。然后,我们逐个读取 `vector` 数组中的元素,并将其添加到一个新的 `vector` 数组中,最后返回一个新的 `MyStruct` 对象。