如何在 C++ 中将 read/write 无符号数组转换为 ifstream/ostream?

How to read/write unsigned array to ifstream/ostream in c++?

我有以下代码:

/*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。
问题出在哪里?

首先,不要使用非字符类型的basic_ofstream模板参数(即charwchar_tchar16_tchar32_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++(可能还有其他一些编译器)在调试模式下用来填充未初始化内存的值。您的数组没有从文件中接收到这个值,这是分配内存时插入的值。