我正在尝试将一个int数组写入fstream,但是当我调用时,我得到了一个异常fstream.write.
我可以fstream用来将int数组写入文件吗?
int main(int argc, char * argv[])
{
fstream amostra("D:\\Amostra.txt", ios::out | ios::binary);
const int total_elements_block = 1024;
const int buffer_size = total_elements_block;
const int total_buffer = 10;
int * buffer = new int [buffer_size];
//for (int j=0; j<total_buffer; j++){
for (int i =0; i<total_elements_block; i++){
buffer[i] = i;
}
amostra.write((char *)(&buffer), total_elements_block*4);
//}
amostra.close();
delete []buffer;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您没有正确地将地址传递给缓冲区.
(char *)(&buffer)
Run Code Online (Sandbox Code Playgroud)
告诉编译器取地址buffer而不是使用包含在buffer哪个点中的指针指向用new分配的内存.要获取缓冲区本身的地址,请将其更改为以下内容.
(char *)(buffer)
Run Code Online (Sandbox Code Playgroud)
Obvlious船长在诊断您的问题时是正确的,但是,这里确实有一些可能的修复.
你可以像他建议和使用那样做(char *)(buffer),但我不同意这种风格.
首先,它使用C风格的强制转换,在C++代码中应该避免使用.这将使一个稍微改进的版本reinterpret_cast<char *>(buffer).这将确保您不会做任何愚蠢的事情,如删除const.
但是,我觉得你可以做得稍好一些.在某些时候,您可能会认为普通数组不适合您.也许你想改成C++ 11 std::array,或者std::vector.突然间你的代码无效了.普通的C风格数组是我最常更改的数据类型.出于这个原因,您可能想要考虑看起来更像的东西reinterpret_cast<char *>(& buffer[0]).
另请注意,您的代码不可移植.int在内存中布局的方式是实现定义的.查看诸如在C++程序中以编程方式检测字节顺序的答案
| 归档时间: |
|
| 查看次数: |
4111 次 |
| 最近记录: |