我正在编写这样的程序来将一些字节写入文件。
#include <fstream>
int main()
{
char buffer[4] = {0, 0, 255, 255};
std::ofstream f("foo.txt", std::ios_base::binary);
f.write(buffer, sizeof buffer);
f.close();
return 0;
}
这工作正常,并在我的系统上给了我预期的结果。
$ g++ -std=c++11 -pedantic -Wall -Wextra signedness.cc
$ ./a.out
$ cat foo.txt
$ od -t x1 foo.txt
0000000 00 00 ff ff
0000004
等效的 C 代码将是:
#include <stdio.h>
int main()
{
char buffer[4] = {0, 0, 255, 255};
FILE *f = fopen("bar.txt", "wb");
fwrite(buffer, sizeof *buffer, sizeof buffer, f);
fclose(f);
return 0;
}
该程序也可以正常工作,并在我的系统上提供预期的输出。
我想知道上述将字节写入文件的方式是否可以。
C++ n3242.pdf的第 4.7 节(积分转换)在第 3 点中提到:
如果目标类型是有符号的,则如果它可以在目标类型(和位域宽度)中表示,则该值不变;否则,该值是实现定义的。
C n1256.pdf的第 6.3.1.3 节(有符号和无符号整数)在第 3 点中提到:
否则,新类型是有符号的,值不能在其中表示;结果是实现定义的,或者引发了实现定义的信号。
从这些摘录中,当我将 255 分配为最后两个字节时,我的程序似乎调用了实现定义的行为,char buffer[4]
因为 255 不能用char
类型表示。如果我对此是正确的,那么将这四个字节写入文件的正确方法是什么?更改buffer
from的类型在 C++ 中char
似乎unsigned char
没有帮助,因为 ofstream 的write()
函数仍然需要第一个参数 to 的 type const char*
。