ifstream

derniels

Grünschnabel
Hallo, in der C++-Referenz steht die Definition von read wie folgt:
istream& read ( char* s, streamsize n );
Ich habe über dieses n nur folgendes gefunden: "Reads a block of data of n characters and stores it in the array pointed by s.". Daher meine Frage: Wieviel bit sind ein Character? (32?)
PS:
Ich möchte einen Block, beginnend bei Offset x, der Länge k Bytes aus einer Datei auslesen. Sollte der Read-Befehl dafür nicht geeignet sein, dann bitte ich um Verbesserungsvorschläge.

Vielen Dank.
MfG Niels
 
Der Meinung war ich bisher auch. Allerdings kommt bei folgendem Code was komisches raus.

Code:
  ifstream test(src); 
  test.seekg (dataOffset);
  char *testC;
  test.read (testC, 1);
  cout << (int)testC[0] << endl;
Ich möchte an der Stelle dataOffset das Byte auslesen. Öffne dich die Datei src im Hexeditor, so steht an der Stelle FF. Der Code gibt mir allerdings -1 aus. Casten auf (unsigned long) gibt 4294967295 zurück. Wie habe ich das Ergebnis zu interpretieren? Soll ich einfach (256 + testC[0]) % 256 rechnen? Wann kann das (int) Casten eines Chars überhaupt negativ sein?

Vielen Danke
MfG Niels
 
int-casten von Chars kann eigentlich nie negativ werden da selbst das kleinste int (short) bis 327xx geht bei signed ...

desweiteren ist signed char zwar theoretisch moeglich, mir aber bisweilen noch nicht begenet.

Mir riecht das eher danach ... als ob das Feld immer mit Typmaximum belegt ist ... besser gesagt eigentlich nichts wirklich zugewiesen wird ... woran das liegt kann ich allerdings auch nicht sagen ... was evtl logisch waer das Test-Array per Referenz zu uebergeben ... vermutlich wird derzeit nichts gespeichert ... warum dann aber immer Typmaximum drin steht ist mir noch ein Raetsel.
 
Hi.

Laudian hat gesagt.:
int-casten von Chars kann eigentlich nie negativ werden da selbst das kleinste int (short) bis 327xx geht bei signed ...
Nein. Das trifft für die char Typen nicht zu. Es gibt nämlich 3 verschiedene char Typen: signed char, unsigned char und char. Es ist nicht so wie z.B. beim Typ int, dass int == signed int ist und man das signed weglassen kann. Je nach Compiler bzw. Architektur ist der Typ char entweder vorzeichenbehaftet oder nicht. Deshalb kann der Wert eines char auch negativ sein.

@derniels: Du hast allerdings versäumt den Zeiger testC zu initialisieren. D.h. du übergibst einen ungültigen Zeiger an die read Funktion. Du mußt schon Speicher für die Werte bereitstellen. Und du solltest natürlich auch immer prüfen, ob das Einlesen erfolgreich war, sonst weißt du doch gar nicht ob etwas eingelesen wurde.
C++:
unsigned char uc;
if (input_stream.read(reinterpret_cast<char*>(&uc), 1)) {
  cout << static_cast<unsigned int>(uc);
} else {
   // Fehler 
}
Gruß
 
Zuletzt bearbeitet:
Hi,
der von mir gepostete Code war nur zur Erklärung des Problems. Im Programm hatte ich das Char-Array initialisiert.
@Laudian: Es kommt bei mir zu Zuweisungen. Lese ich einen größeren Bereich aus der Datei aus, so sind auch richtige Werte dabei. Ich hatte nur das Problem bei FF.
@deepthroat: Mein Compiler nimmt dann anscheinend automatisch (signed char). Wenn ich meinen cast veränder zu (int)(unsigned char)testC[0], dann funktionierts. Hat deine Methode einen Vorteil gegenüber meiner?

Da unsigned char den Wertebereich [-128, 127] hat, bewirkt (256 + (int)testC[0]) % 256 aber genau dasselbe. Welche Methode ist die schnellere?

MfG Niels
 
Hi.
@deepthroat: Mein Compiler nimmt dann anscheinend automatisch (signed char).
Nein, nimmt er nicht. Wie ich bereits sagte, sind signed char und char verschiedene Typen. Wenn du allerdings meintest, dass dein char Typ vorzeichenbehaftet ist, dann ist das so richtig.
Wenn ich meinen cast veränder zu (int)(unsigned char)testC[0], dann funktionierts. Hat deine Methode einen Vorteil gegenüber meiner?
In C++ Code sollte man immer die neuen Cast-Operatoren (static_cast, reinterpret_cast etc.) verwenden. Siehe z.B. http://de.geocities.com/throni3/cpp/Kapitel_25.html
Da unsigned char den Wertebereich [-128, 127] hat
unsigned char ist nicht-vorzeichenbehaftet. Der Wertebereich ist 0..255.
bewirkt (256 + (int)testC[0]) % 256 aber genau dasselbe. Welche Methode ist die schnellere?
Ich würde vermuten, das ein Cast schneller ist. Es ist aber vielmehr so, dass deine Methode nicht portabel ist. Oder kannst du zeigen, das diese Methode immer funktioniert?

Gruß
 
Hi,
deepthroat hat gesagt.:
Hi.
Nein, nimmt er nicht. Wie ich bereits sagte, sind signed char und char verschiedene Typen. Wenn du allerdings meintest, dass dein char Typ vorzeichenbehaftet ist, dann ist das so richtig.
Ich habe in einem Tutorial gelesen, dass char je nach Compilereinstellung als signed oder unsigned char behandelt wird. Es wird also nur zwischen diesen zwei Typen unterschieden.

deepthroat hat gesagt.:
unsigned char ist nicht-vorzeichenbehaftet. Der Wertebereich ist 0..255.
Ja ich hatte mich verschrieben, ich meinte natürlich signed char.

deepthroat hat gesagt.:
Ich würde vermuten, das ein Cast schneller ist. Es ist aber vielmehr so, dass deine Methode nicht portabel ist. Oder kannst du zeigen, das diese Methode immer funktioniert?
Da es ja (belehr mich eines Besseren, wenn das falsch ist) nur unsigned char mit Wertebereich [0,255] und signed char mit Bereich [-128,127] gibt, lässt sich einfach zeigen, dass mein Verfahren funktioniert.

Noch eine Frage dazu. Ist folgende Zuweisung ok, oder wäre das mit einem zusätzlichen int-Cast sauberer?
char zeichen = in_stream.get();
int test = static_cast<unsigned char>(zeichen);

MfG Niels
 
Ich habe in einem Tutorial gelesen, dass char je nach Compilereinstellung als signed oder unsigned char behandelt wird. Es wird also nur zwischen diesen zwei Typen unterschieden.
Nein, der Compiler unterscheidet zwischen 3 char Typen:
C++:
void f(signed char c) { }
void f(unsigned char c) { }

f('a'); // Fehler: keine passende Funktion
Noch eine Frage dazu. Ist folgende Zuweisung ok, oder wäre das mit einem zusätzlichen int-Cast sauberer?
C++:
char zeichen = in_stream.get();
int test = static_cast<unsigned char>(zeichen);
Im Grunde wäre es schon sauberer, allerdings kann bei der Typpromotion nichts schief gehen...

Gruß
 
Zurück