【问题标题】:How to read/write unsigned array to ifstream/ostream in c++?如何在 C++ 中读取/写入无符号数组到 ifstream/ostream?
【发布时间】:2017-08-07 06:29:24
【问题描述】:

我有以下代码:

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

【问题讨论】:

  • out.write(arr, 500); 非常接近,但 write 需要字节而不是数组元素的计数。 out.write(arr, 500* sizeof(arr[0])); 应该为你做。 read 同上。
  • 请注意,如果您在 25 时得到错误值,要么您的数组有 50 个元素长,您的编译器使用了一个非常大的 short,或者还有其他事情发生没看到。
  • 我检查了它,它不起作用。奇怪的是它将数组保存到文件中的 255
  • 确认。 255讲述了这个故事。文件在文件中找到一个 eof 字符并退出 . out(path, std::ios::out); 需要指定二进制读写。试试out(path, std::ios::binary);read 也一样。不需要 std::ios::out,因为它是通过创建 ofstream 来暗示的。
  • 这导致了一些有趣的路径。我以前从未尝试过使用std::basic_ofstream&lt;unsigned short&gt;。坦率地说,我无法让它工作。 write 每次都失败,我在这个时间还不够清醒,无法完全解开缺失的内容。但是如果你 std::ofstream out("test.bin", std::ios::binary); 并在读写时将数组转换为 char* 你应该回到游戏中。

标签: c++ arrays file ifstream ostream


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多