2016-08-07 14 views
-5

Ich versuche, eine Bilddatei einzulesen.C++ was passiert mit meiner ifstream.get() Funktion?

#include <iostream> 
#include <fstream> 

using namespace std; 


int main() 
{ 

    ifstream read("C://Users/Ben/Desktop/1.jpg"); 

    while (1){ 
     cout << read.get(); 
     cin.get(); 
    } 


    return 0; 
} 

Wenn ich das tue, erhalte ich eine Reihe von Zahlen im Bereich von 0 bis 255. So in dem Byte-Wert Ich nehme an, es liest richtig, mit Ausnahme der Tatsache, dass ich getroffen -1 (EOF) vorzeitig . Nach ungefähr 30 bis 40 Werten erscheint die -1. Es ist eine 3 MB große Datei. Ich erwarte nicht, dass -1 erst viel später erscheint. Was ist los?

+0

Wahrscheinlich müssen Sie den Binärmodus angeben, wenn Sie die Datei öffnen ('fopen (file," rb ")' in C; ich weiß nicht, wie man das mit Streams macht). – melpomene

+2

'ifstream :: traits_type :: eof()' wird nicht unbedingt zu '-1' ausgewertet, aber selbst wenn es das tut, was ist die Ausgabe, wenn es '0xFF' Bytes in der Datei gibt? – user657267

+1

Sie haben die Datei nicht im Binärmodus geöffnet. Versuchen Sie, dem Konstruktor der Form 'ios_base :: in | ein zweites Argument zu geben ios_base :: binary'. – Peter

Antwort

-3

Versuchen diesen:

#include <iostream> 
#include <fstream> 

using namespace std; 

int main() 
{ 

    // Add the mode ios::binary to make the file load in binary format. 

    ifstream read("C://Users/Ben/Desktop/1.jpg", ios::binary); 

    // Declare data variable 

    int data = 0; 

    // Reading loop 

    while (read.read((char*)&data, 4) && read.gcount() != 0) { 

     // Output data 

     cout << data << endl; 
    } 

    // Wait for user input before closing program 

    cin.get(); 

    return 0; 
} 
+0

Das gleiche wie hier: http://stackoverflow.com/a/38809885/1413395 Leider können Sie nicht sehen: P –

+2

http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-conspired-wrong – melpomene

+0

Crimson Wife: Ty! Ich habe es versucht und es hat funktioniert. aber ich habe ein bisschen modifiziert. Ich deklarierte eine int-Variable 'A' und instantiierte sie innerhalb der while-Schleife als A = read.get(); aber wenn ich das tue, bedeutet das, dass A in 4 Bytes gleichzeitig liest, da int eine Größe von 4 Bytes hat. Aber warum sind die Werte, die ich bekomme, zwischen 0 und 255? sollten sie nicht von 0 ~ 2^32 reichen? – Benn

0

Als @melpomene mentioned in their comment es ein Unterschied für die Ergebnisse der std::ifstream::get() sein kann in Bezug auf die Datei (zumindest für das Windows-Betriebssystem wie es scheint) den std::ios::binary Modus oder nicht geöffnet wurde mit.

Es gibt keine Hinweise darauf, dass ein Wert von -1 als Ergebnis von std::ifstream::get() zeigt an, dass der read Strom in std::ifstream::eof() Zustand befindet. Weitere Informationen finden Sie in der Referenzdokumentation std::ifstream::get().