如何在c ++中读取/写入无符号数组到ifstream / ostream?

时间:2017-08-07 06:29:25

标签: c++ arrays file ifstream ostream

我的代码如下:

/*write to file*/
std::basic_ofstream<unsigned short> out(path, std::ios::out);
unsigned short *arr = new  unsigned short[500];
for (int i = 0; i < 500; i++)
{ 
    arr[i] = i;
}

out.write(arr, 500);
out.close();

/*read from file*/
unsigned short * data = new unsigned short[500];
std::basic_ifstream<unsigned short> rfile(path);
rfile.read(data, 500);
rfile.close();

我只是写一个无符号的短数组到文件然后我读取,但读数值是正确的,直到数组中的索引25,然后值为52685.
问题在哪里?

1 个答案:

答案 0 :(得分:0)

首先,请勿使用非basic_ofstreamcharwchar_t或{{1} char16_t的模板参数char32_t }})。在大多数情况下,只需使用ofstream(和ifstream作为输入)。

您的输入在第25个字符后停止的事实实际上是您可能在Windows上的线索,其中ASCII字符26 Substitute character用于指示文本流的文件结尾。您尝试读取和写入二进制数据,因此需要使用二进制标志打开文件。

/*write to file*/
std::ofstream out(path, std::ios::binary);
unsigned short *arr = new  unsigned short[500];
for (int i = 0; i < 500; i++) { 
    arr[i] = i;
}

out.write((char const*)arr, 500 * sizeof(arr[0]));
out.close();

/*read from file*/
unsigned short * data = new unsigned short[500];
std::ifstream rfile(path, std::ios::binary);
rfile.read((char*)data, 500 * sizeof(data[0]));
rfile.close();

另外有趣的是,52685,十六进制是0xCDCD。这是Visual C ++(可能还有一些其他编译器)用来在调试模式下填充未初始化内存的值。您的数组未从文件中接收此值,这是在分配内存时插入的值。

相关问题