2012-06-22 194 views
1

我想写一个int数组到一个fstream,但我收到一个异常,当我打电话fstream.writeC++写入int缓冲区

我可以使用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; 
} 
+1

“我可以使用fstream在文件中写入一个int缓冲区吗?”如果你正确格式化,fstream可以写任何你想要的文件。简单的回答:是的。如果你想要_actual code_请求,而不是一个简单的布尔答案。 – TheZ

+1

请发布你得到的例外。 –

+0

您应该使用total_elements_block * sizeof(buffer [0]),以便安全/便携:-) –

回答

5

Obvlious队长是在诊断问题是正确的,但是,也有真的在这里的几个可能的修复。

你可以按照他的建议和使用(char *)(buffer),但我不同意这种风格。

首先,它使用C风格的转换,这应该在C++代码中避免。这将会使一个稍微改进的版本为reinterpret_cast<char *>(buffer)。这将确保你不会做任何愚蠢的事情,比如删除const

但是,我觉得你可以做得比这略好。在某个时候,你可能会认为一个普通的数组不适合你。也许你想更改为C++ 11 std::arraystd::vector。突然你的代码将无法工作。普通的C风格数组是我经常更改的数据类型。出于这个原因,你可能想要考虑一些看起来更像reinterpret_cast<char *>(& buffer[0])的东西。

另请注意,您的代码不可移植。 int在内存中的布局方式是实现定义的。看看答案如Detecting endianness programmatically in a C++ program

5

您没有正确地将地址传递到缓冲区。

(char *)(&buffer) 

告诉编译器采取的buffer的地址,而不是使用包含在buffer指针指向新分配的内存中。要获取缓冲区本身的地址,请将其更改为以下内容。

(char *)(buffer)