C++ 使用write()将未签名字符写入二进制文件
我正在制作一个读取二进制文件的程序。因此,我将单个字节读入无符号字符(实际上将数据读入字符,并将每个字符转换为无符号字符)。现在我必须将未签名字符写回二进制文件 问题是,现在我被迫在将单个字节强制转换为char后写入它们(因为二进制文件的write()需要char*buffer)。因此,现在我必须做以下工作:C++ 使用write()将未签名字符写入二进制文件,c++,file-io,binary,C++,File Io,Binary,我正在制作一个读取二进制文件的程序。因此,我将单个字节读入无符号字符(实际上将数据读入字符,并将每个字符转换为无符号字符)。现在我必须将未签名字符写回二进制文件 问题是,现在我被迫在将单个字节强制转换为char后写入它们(因为二进制文件的write()需要char*buffer)。因此,现在我必须做以下工作: for(int x=0; x<data_size; x++) { ch=(char)data[x]; outfile.write(&ch,1); } for
for(int x=0; x<data_size; x++)
{
ch=(char)data[x];
outfile.write(&ch,1);
}
for(int x=0;x您可以在指针上执行强制转换
outfile.write((char *)&data[0], data_size);
读取时也可以这样做(即,只需将指向无符号字符数组的第一个元素的指针传递给一个指向字符的指针)。输出文件的类型是流的,对吗?流的是流的类型定义
typedef std::basic_ofstream<char, std::char_traits<char> > ofstream;
然后呢,
uofstream outfile(...);
outfile.write(data, data_size); //no need to cast
当数据
的类型为无符号字符*
或无符号字符[]
且您只想将位写入文件时,请执行指针转换:
for(int x=0; x<data_size; x++)
{
outfile.write((char*)data + x, 1);
}
请注意,这比类型检查更有效,因此不是最佳解决方案。不要一次写入一个字节,而是写入更大的块(比如64kiB).就这一点而言,阅读也是如此。我想要一个明确的reinterpret\u cast
better@Kerrek:问题说明outfile.write需要一个char*
字符,我想说的是,两个字符都不要用。如果只是临时数据,可以,但如果您这样写数据,在将来某个时候,您将无法读取。@James Kanze:你是在提倡用xml节点保存RGB图像的每个像素吗?:-)@6502我在哪里说过xml?我提倡以已知和定义的格式保存数据,以便以后可以重新读取。(大多数图像文件都有您必须遵守的已定义格式。)这是未定义的行为。实现没有义务在特定编译器上提供std::char_traits
的实例化,以及那些具有不兼容实例化的实例化。@c0da它可能会提供。也可能不是。我认识一些人,他们试图用VS和g++来实现这一点,但得到了两种完全不同的行为。遗憾的是,这在gcc v.4.7.2中不起作用。它创建并打开文件,但不会向其中写入任何数据。这不适用于clang++5.0.0,尽管解决方案看起来很优雅。创建一个文件,但写入失败,最终结果是文件大小为0字节。
for(int x=0; x<data_size; x++)
{
outfile.write((char*)data + x, 1);
}
outfile.write((char*)data, data_size);