私はファイルにいくつかのバイトを書き込むためにこのようなプログラムを書いています。
#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で言及しています。
それ以外の場合、新しいタイプは署名され、値を表すことができません。結果が実装定義であるか、実装定義のシグナルが発生します。
char buffer[4]
これらの抜粋から、 255を型で表すことができないため、255を最後の2バイトとして割り当てると、プログラムが実装定義の動作を呼び出すように見えますchar
。私がこれについて正しければ、これらの4バイトをファイルに書き込む正しい方法は何でしょうか?タイプをbuffer
からchar
に変更unsigned char
しても、C ++では役に立たないようです。これは、ストリームのwrite()
関数がまだタイプの最初のパラメーターを想定しているためconst char*
です。