0


0

整数値「0」を.binファイルに保存する方法は? (C)

編集:どうやら、問題は読み取り機能にあります:私は16進エディタでデータをチェックしました

+02 00 00 00 01 00 00 00 00 00 00 00 00 +

そのため、ゼロはゼロとして格納され、ゼロとして読み取られることはありません。

私が私の通常のbin-storeファイル機能を使うとき:

int a = 0;
file.write(reinterpret_cast(&a), sizeof(a));

0を `+ char +`バージョン、または "\ 0"として格納します。これは明らかに格納されていないため(null値ですか?)、関数を呼び出してゼロ値を読み取ると、その直後に値を読み取ります(または、ファイルの最後の場合は直前)。 では、どうすれば.binファイルに正しくゼロを格納できますか?

編集:これは、読み書き処理に関連する機能の一部です。

//Init program: creates a sector.bin for another program to read from.
#include
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(&a), sizeof(a));
    file.write(reinterpret_cast(&b), sizeof(b));
    file.write(reinterpret_cast(&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<(&data), sizeof(data));
    return data;
}
また、 `+ sector

Init +`を使用した場合の出力は次のとおりです。

2
1
1

私がビンに書き込もうとしていたという出力は、

2
1
0

したがって、0は1として読み書きされているか、または書き込まれておらず、Initは最後の値を2回読みます。

4 Answer


2


int num = 0;書く(fd、


1


ファイルに「整数値0を格納する」とはどういう意味ですか。 ファイルには整数ではなくバイトが含まれています。 sizeof(int)0バイトを格納する必要がありますか、それとも1つの '\ 0’バイトを格納する必要がありますか?

P.S 私はまた問題があなたのコードにあるかもしれないと思います。 あなたは16進エディタであなたの.binファイルを見ましたか?

P.P.S. *あなたの問題はseekg()関数の使用法にあります。 オフセットをバイト単位で渡す代わりに、posを渡します。 代わりにpos * sizeof(int)にしてください。


1


私はあなたが何をしたいのかわからない、私にはそれはあなたが提供したコードはあなたが求めていることをしているようだ:

int main() {
   std::ofstream file("/tmp/tst.out");
   int a = 0;
   file.write(reinterpret_cast(&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


0


バイナリファイルにどのような形式を含める必要があるかを考える必要があります。テキストファイルと同じようにする必要はないため、テキストファイルが何度も使用されます。

sizeof(int)== 4(およびCHAR_BITS == 8)の(32ビット)マシンを想定すると、ネイティブフォーマットを使用して現在のファイルの場所にすべて0の4バイトを格納できます。うまくいくと思います。 あなたは0x01020304の​​ような他の値で実験することができます、あなたはあなたのマシンのバイトレイアウトを見るでしょう。

もちろん、書き込みに使用された手順を逆にして、注意深く読み返す必要があります。 そして、書き込まれたばかりのデータを再度読み取る前に、ファイルの位置を変更することを忘れないでください。