2016-12-05 4 views
-1

Ich habe eine Textdatei mit vorzeichenlosen Ganzzahlen im Bereich 0, .., 2^32-1. Jede Zeile enthält eine einzelne ganze Zahl (und ein Zeilenumbruchzeichen).Lesen Sie eine Datei mit unsigned Ints und schreiben Sie es in Binär in C++

Ich möchte es in eine Binärdatei schreiben, um Platz zu sparen (so dass jedes int genau 4 Bytes dauert). Was wäre der beste Weg das zu tun?

Ich habe ein paar Optionen ausprobiert, keiner von ihnen scheint zu funktionieren. Hilfe wird geschätzt.

Strom (nicht arbeiten) Code:

#include <fstream> 
#include <iostream> 
#include <stdio.h> 

int main(){ 
    int x; 
    while (std::cin >> x){ 
     fwrite((void*)&x, sizeof(x), 1, stdout); 
    } 
    return 0; 
} 

Es wird mit kompiliert: g++ compress.cc -o compress.

Es scheint jedoch, nur die erste Ganzzahl auszugeben.

Zum Beispiel haben die ich den Befehl lief ./compress < bla | wc -c

Wo „bla“ eine Datei

1864754174 
2150244390 
1703231727 

Das Ergebnis des Befehls enthält, war 4, und nicht 12 als ich erwartet hatte.

+2

Was haben Sie versucht? gerade jetzt, diese Frage ist nur geben Sie mir den Code. Das wird fast sofort abgelehnt und geschlossen. Denken Sie daran, Ihre Frage zu bearbeiten, antworten Sie nicht einfach im Kommentarbereich. –

+0

@Ben - Code hinzugefügt, danke für deinen Kommentar. –

+3

Ok, was funktioniert jetzt nicht? Bitte lesen Sie, wie man einen [MCVE] (http://stackoverflow.com/help/mcve) erstellt –

Antwort

3

Ihr Problem ist, dass Sie versuchen, int anstelle von unsigned Int zu schreiben. der Unterschied zwischen diesen 2 ist nicht die Größe von ihnen, aber die Verwendung der Bytes.

in unsigned int jedes Bit reprsent 2^(Index -1) Index von 1 beginnend

in int den Bits wie unsiged int verwendet werden, nur das letzte Bit wird verwendet, um das Vorzeichen der Zahl und beacuse reprsent davon können Sie kleinere Zahlen darstellen.

+0

Erklärt dies, warum es scheint, nur ein "Int" zu schreiben – qxz

+0

Das hat tatsächlich funktioniert. Wie dumm von mir. Vielen Dank ! –

0

Wenn ich Sie richtig verstanden habe, möchten Sie aus einer Textdatei mit uints lesen und diese in eine Binärdatei schreiben. Reading:

std::vector<unsigned int> readUints(const std::string& filepath){ 
    std::vector<unsigned int> numbers; 
    std::ifstream file(filepath); 
    if(!file.is_open()){ 
     //Handle file not found 
    } 
    unsigned int number = 0; 
    while(file >> number){ 
     numbers.push_back(number); 
    } 
    return numbers; 

Schreiben:

void writeUints(const std::vector<unsigned int>& numbers, const std::string& filepath){ 
    std::ofstream file(filepath, ios_base::binary | ios_base::out); 
    if(!file.is_open()){ 
     //Handle file not found 
    } 
    for(int i = 0; i < numbers.size(); i++){ 
     file.write(reinterpret_cast<char*>(&numbers[i], 4); 
    } 
} 

Stellen Sie sicher, <fstream> aufzunehmen. Sie können unsigned int zu uint32_t ändern, um sicherzustellen, dass es auf jeder Plattform genau 32 Bits breit ist

Verwandte Themen