0

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

02 00 00 00 01 00 00 00 00 00 00 00

したがって、ゼロはゼロとして読み取られるのではなく、ゼロとして格納されます。

通常の store-in-bin ファイル機能を使用すると、次のようになります。

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 回読み取っています。

4

4 に答える 4

2

int num = 0;
write( fd, &num, sizeof( int ));
于 2009-05-27T00:29:01.880 に答える
1

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

PS また、問題は読み取りコードにある可能性があると思います。16 進エディタで .bin ファイルを見ましたか?

PPSあなたの問題は、seekg() 関数の使用法にあります。オフセットをバイト単位で渡す代わりに、pos を渡します。代わりに pos * sizeof(int) にする必要があります。

于 2009-05-27T00:28:17.730 に答える
1

あなたが何をしたいのかわかりません。私には、あなたが提供したコードがあなたが求めていることをしているようです:

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
于 2009-05-27T00:34:57.110 に答える
0

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

sizeof(int) == 4 (および CHAR_BITS == 8) である (32 ビット) マシンを想定すると、ネイティブ形式を使用して現在のファイルの場所にすべてゼロの 4 バイトを格納できます。うまくいくはずだと思います。0x01020304 などの他の値を試すことができます。マシンのバイト レイアウトが表示されます。

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

于 2009-05-27T00:33:49.453 に答える