整数値「0」を .bin ファイルに保存するにはどうすればよいですか?(C++)
-
06-09-2019 - |
質問
編集:どうやら、問題は読み取り関数にあります。16進エディタでデータを確認しました
02 00 00 00 01 00 00 00 00 00 00 00
したがって、ゼロはゼロとして読み取られるのではなく、ゼロとして保存されます。
通常のストアインビンファイル機能を使用すると、次のようになります。
int a = 0;
file.write(reinterpret_cast<char*>(&a), sizeof(a));
として 0 を格納します。 char
バージョン、または "\0" は明らかに保存されていないため (null 値であるため?)、関数を呼び出してゼロ値を読み取ると、その値の直後 (または、それがゼロ値である場合はその直前) の値を読み取ります。ファイルの最後)。では、どうすれば .bin ファイルにゼロを適切に保存できるでしょうか?
編集:読み取り/書き込みプロセスに関連する関数の一部を次に示します。
//Init program: creates a sector.bin for another program to read from.
#include<fstream>
using namespace std;
int main()
{
fstream file;
file.open("sector.bin", ios::out | ios::binary);
if(!file.is_open())
{
file.open("sector.bin", ios::out | ios::binary);
file.close();
file.open("sector.bin", ios::out | ios::binary);
if(!file.is_open())
{
return -1;
}
}
file.seekp(file.beg);
int a = 2;
int b = 1;
int c = 0;
file.write(reinterpret_cast<char*>(&a), sizeof(a));
file.write(reinterpret_cast<char*>(&b), sizeof(b));
file.write(reinterpret_cast<char*>(&c), sizeof(c));
file.close();
return 0;
}
//Read function: part of another program that intializes variables based off
//of sector.bin
void sector::Init(std::fstream& file)
{
int top_i = FileRead(file,0);
std::cout<<top_i<<std::endl;
for(int i = 0; i < top_i; i++)
{
accessLV[i] = FileRead(file,i+1);
std::cout<<accessLV[i]<<std::endl;
}
std::cin.ignore();
viral_data.add(new X1(5,5,'X'));
viral_data.add(new X1(9,9,'X'));
player.set(0,0,'O');
return;
}
//the FileRead used in init
int FileRead(std::fstream& file, int pos)
{
int data;
file.seekg(file.beg + pos);
file.read(reinterpret_cast<char*>(&data), sizeof(data));
return data;
}
また、使用するための出力 sector::Init
以下のとおりであります:
2
1
1
ビンに書き込もうとした出力は次のとおりです
2
1
0
したがって、0 が 1 として読み書きされるか、書き込まれずに Init が最後の値を 2 回読み取っているかのどちらかです。
解決
ファイルに「整数値 0 を保存する」という意味が明確ではありません。ファイルには整数ではなくバイトが含まれます。sizeof(int) 0 バイトを保存する必要がありますか、それとも 1 つの '\0' バイトだけを保存する必要がありますか?
追伸また、読み取ったコードに問題がある可能性もあると思います。.bin ファイルを 16 進エディタで調べましたか?
追伸 あなたの問題は、seekg() 関数の使用法にあります。オフセットをバイト単位で渡す代わりに、pos を渡します。代わりに pos * sizeof(int) にする必要があります。
他のヒント
int num = 0;
write( fd, &num, sizeof( int ));
私はあなたが何をしたいのかわからないんだけど、私にはあなたが提供したコードは、あなたが求めているものと思われるん
int main() {
std::ofstream file("/tmp/tst.out");
int a = 0;
file.write(reinterpret_cast<char*>(&a), sizeof(a));
return 0;
}
これはゼロ整数のバイナリ表現を含む4つのバイトのサイズのファイルに結果:
$ hexdump /tmp/tst.out
0000000 0000 0000
0000004
あなたはそれはあなたが<<
でフォーマットストリーム出力を使用する必要がありますASCII表現だとして整数を格納する場合:
std::ofstream file("/tmp/tst.out");
int a = 0;
file << a << std::endl;
この方法は、あなたが得る:
$ cat /tmp/tst.out
0
あなたは、バイナリファイルが含まれている必要がありますフォーマットするものを考える必要があり - 。あなたは何度もテキストファイルが使用されている理由であるテキストファイルと同じように行う必要はありません何かを
(32ビット)マシンのsizeof(INT)== 4(及びCHAR_BITSの== 8)と仮定すると、あなたはネイティブフォーマットを使用して現在のファイルの場所ですべてゼロである4つのバイトを格納することができ、その後、何」得veはそこに動作するはずです、私は思います。あなたは、あなたのマシン上のバイトレイアウトが表示されます、など0x01020304などの他の値を試してみることができます。
もちろん、あなたが書き込みのために使用された手順を逆に、後ろにそれを読んで注意する必要があります。そして、ちょうど書き込まれたデータを再読み込みしようとする前に、ファイルを再配置することを忘れないでください。