Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用二维动态数组对文件进行二进制I/O_C++_Arrays_Serialization_Dynamic_Binary - Fatal编程技术网

C++ 使用二维动态数组对文件进行二进制I/O

C++ 使用二维动态数组对文件进行二进制I/O,c++,arrays,serialization,dynamic,binary,C++,Arrays,Serialization,Dynamic,Binary,我在使用二维动态数组进行文件的I/O时遇到问题。它编译得很好,但它不能像我想要的那样工作。例如,我保存了数字1的“映射”,在此之后,我将源代码中的数字更改为示例5并编译它,现在我加载了数字1的“映射”,但当它在循环中写入时,输出是5而不是1。有人能帮我修一下密码吗 #include <iostream> #include <fstream> int main() { int ** array; array = new int*[20]; for(int y=0;y<

我在使用二维动态数组进行文件的I/O时遇到问题。它编译得很好,但它不能像我想要的那样工作。例如,我保存了数字1的“映射”,在此之后,我将源代码中的数字更改为示例5并编译它,现在我加载了数字1的“映射”,但当它在循环中写入时,输出是5而不是1。有人能帮我修一下密码吗

#include <iostream>
#include <fstream>
int main()
{
int ** array;

array = new int*[20];
for(int y=0;y<20;y++)
    array[y] = new int[30];

for(int y=0;y < 20;y++)
    for(int x=0;x < 30;x++)
        array[y][x] = 1;

int volba = 1;
std::cin >> volba;

if(volba)
{
    std::ifstream in("map",std::ios::in | std::ios::binary);
    if(!in.is_open())
        std::cout << "in map open error\n";
    in.read((char*)&array, sizeof(array));
    in.close();
    std::cout << "loaded\n";
}
else
{
    std::ofstream out("map",std::ios::out | std::ios::binary);
    if(!out.is_open())
        std::cout << "out map open error\n";
    out.write((char*)&array, sizeof(array));
    out.close();
    std::cout << "saved\n";
}

std::cout << "array\n";
for(int y=0;y < 20;y++)
{
    for(int x=0;x < 30;x++)
        std::cout << array[y][x] << " ";
    std::cout << std::endl;
}

for(int y=0;y<20;y++)
    delete [] array[y];
delete [] array;

return 0;
}
#包括
#包括
int main()
{
整数**数组;
数组=新整数*[20];
对于(int y=0;y>volba;
如果(沃尔巴)
{
std::ifstream in(“map”,std::ios::in | std::ios::binary);
如果(!in.is_open())

std::cout错误在于
sizeof(array)
等于指针的大小,而不是动态分配内存的大小。因此,您只能读/写4(或8)个字节。使用实际数组大小(在本例中为
20*30
)而不是
sizeof(array)
主要问题是这样的:

array = new int*[20];
您分配了一个指针数组,它不会像以后那样成为二维数组:

array[y] = new int[30];
请注意,这两者之间存在差异

// array of pointers to integer arrays
int ** array = new int*[20];
for(int y=0;y<20;y++)
  array[y] = new int[30];
不能假定数组数组位于连续内存中


此外: 特此

您只需写出指针,而不是实际数据。请尝试打印
sizeof(数组)

#包括
int main(){
int*数组=新的int[10];

std::我是否尝试将sizeof(array)更改为sizeof(int)*600,但我仍然有这个问题:“例如,我保存了数字1的“映射”,之后我将源代码中的数字更改为示例5并编译它,现在我加载了数字1的“映射”,但当它在最后写入循环时,输出是5而不是1。”您的代码中还有另一个问题,请参阅@moooeeep的答案。@user1295618-我已经用粗体显示了一个选项。您也可以使用静态二维
数组[20][30]
@user1295618-当然不是。好的编程方法是使用
std::vector
,并可能增强序列化。
// two dimensional integer array
int array[20][30];
out.write((char*)&array, sizeof(array));
#include <iostream>

int main() {
  int * array = new int[10];
  std::cout << sizeof(array) << std::endl; // probably prints 4 or 8
  return 0;
}