Frage

EDIT: Anscheinend ist das Problem in der Lesefunktion: ich die Daten in einem Hex-editer geprüft

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

So ist die Null als Null gespeichert wird, nur nicht als Null gelesen.

Weil, wenn ich meine normalen Speicher-in-bin-Datei-Funktion:

int a = 0;
file.write(reinterpret_cast<char*>(&a), sizeof(a));

Es speichert 0 als char Version oder „\ 0“, was offensichtlich nicht gespeichert ist (weil es ein Nullwert ist?), So, wenn ich meine Funktion aufrufen, den Nullwert zu lesen, liest den Wert direkt nach dem (oder kurz vor, wenn es würde die letzte in der Datei sein). So wie kann ich speichern Null in einer .bin-Datei richtig?

EDIT: Hier sind nur einige der Funktionen an den Lese- / Schreibvorgang im Zusammenhang:

//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;
}

Auch der Ausgang für sector::Init ist wie folgt:

2
1
1

Die ouput, die ich in den Behälter zu schreiben versuchte, war

2
1
0

Also entweder die 0 wird als 1 gelesen / geschrieben, oder es ist nicht geschrieben und Init den letzten Wert zweimal liest.

War es hilfreich?

Lösung

Es ist nicht klar, was meinen Sie in einer Datei „Integer-Wert 0 Speichern“. Dateien enthalten Bytes, keine ganzen Zahlen. Haben Sie sizeof (int) 0-Bytes, oder einfach nur eine '\ 0' Byte speichern müssen?

P. S. Ich würde auch das Problem denkt, in Ihrem gelesenen Code sein könnte. Haben Sie Blick auf Ihre .bin-Datei in einem Hex-Editor?

P.P.S. Ihr Problem ist in seekg () Funktion Nutzung. Statt in Bytes der Offset-passing, übergeben Sie pos. Es sollte pos * sizeof (int) statt.

sein

Andere Tipps


int num = 0;
write( fd, &num, sizeof( int ));

Ich bin nicht sicher, was du mir tun wollen, scheint es der Code, den Sie zur Verfügung gestellt hat, was Sie fragen nach:

int main() {
   std::ofstream file("/tmp/tst.out");
   int a = 0;
   file.write(reinterpret_cast<char*>(&a), sizeof(a));
   return 0;
}

Dies resultiert in einer Datei von vier Bytes, die die Größe Binärdarstellung einer ganzen Zahl Null enthalten:

$ hexdump /tmp/tst.out
0000000 0000 0000
0000004

Wenn Sie die ganze Zahl zu speichern, wie es ASCII ist Darstellung sollten Sie formatiert Stream-Ausgabe mit << verwenden:

std::ofstream file("/tmp/tst.out");
int a = 0;
file << a << std::endl;

Auf diese Weise erhalten Sie:

$ cat /tmp/tst.out
0

Sie müssen denken, was die Binärdateiformat enthalten sollte - etwas, das Sie müssen mit Textdateien in der gleichen Art und Weise nicht tun, weshalb oft eine Textdatei verwendet wird

.

Unter der Annahme einen (32-Bit) Computer, auf den sizeof (int) == 4 (und CHAR_BITS == 8), dann können Sie 4 Bytes speichern, die alle Nullen an dem aktuellen Dateipfad sind mit nativen Format, dann, was Sie‘ ve erhielt es sollte funktionieren, denke ich. Sie könnten mit anderen Werten experimentieren wie 0x01020304, können Sie das Byte-Layout auf Ihrem Computer sehen.

Natürlich müssen Sie vorsichtig sein, es wieder in das Lesen, das Verfahren umgekehrt zum Schreiben verwendet. Und vergessen Sie nicht, die Datei neu zu positionieren, bevor Sie die Daten noch einmal lesen gerade geschrieben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top