Wofstream Binär Optionen


Ich lese eine Binärdatei als: Aber ich merke das ist nicht eine echte Binärdatei. Der ifstream liest tatsächlich ein Byte und wandelt es in ein breites Zeichen um. Also, wenn die Binärdatei den Inhalt 0x112233 hat. Ff. Ich habe eigentlich 0x110022003300 gelesen. Ff00 Das macht mir nicht viel Sinn: erstmal muss ich nur einen breiten fstream verwenden, da der Dateiname nicht lateinisch ist. Zweitens, wenn ich sage, dass der fstream binär ist, warum liest gelesen breite chars Der Code unten tut was ich will. Gibt es einen Weg zu erreichen, dass mit std fstreams gefragt Mar 21 11 um 19:15 I39m mit Visual Studio für Windows und Intel-Compiler für Linux. Ihre Lösung hat in Windows gut funktioniert. Ich habe es noch bei Linux probiert. Es ist eine ganz elegante Lösung. Ich ziehe es vor, mich nicht auf Compiler-Erweiterungen zu verlassen. Glaubst du, dass du das an den Standard anhängen kannst, vielleicht spezifizierst du den Zeichensatz als einen vorbereiteten Parameter an ifstream ndash rturrado Mar 22 11 um 15:15 rturrado: (entfernte meinen vorherigen Kommentar) Ich empfehle nicht mehr Boost. Filesystem seit seiner Ansatz ist es, verschiedene Schnittstellen auf verschiedenen Plattformen zu definieren, was grundsätzlich Portabilitätsprobleme verursacht und es in der Tat schwerer macht, Unicode korrekten Code zu schreiben. Aus meiner Erfahrung ist es besser, dem Ansatz zu folgen, den ich im EDIT geschrieben habe. Ndash ybungalobill Aug 23 12 at 13: 00C Binärdatei IO Normalerweise, für Binärdatei io Sie verwenden nicht die herkömmlichen textorientierten ltlt und Operatoren Es kann getan werden, aber das ist ein fortgeschrittenes Thema. Grundmodell für Datei IO In C sind die Dateistromklassen mit der Idee entworfen, dass eine Datei einfach als Stream oder Array von uninterpretierten Bytes betrachtet werden soll. Zur Vereinfachung wird das Array von in einer Datei gespeicherten Bytes von null auf len -1 indiziert, wobei len die Gesamtzahl der Bytes in der gesamten Datei ist. Jede offene Datei hat zwei damit verbundene Positionen: Die aktuelle Leseposition, die der Index des nächsten Bytes ist, der aus der Datei gelesen wird. Dies wird als der Zeiger bezeichnet, da er auf den nächsten Charakter verweist, dass die grundlegende Get-Methode zurückkehren wird. Die aktuelle Schreibposition, die der Index der Byteposition ist, wo das nächste Ausgangsbyte platziert wird. Dies wird als Putzeiger bezeichnet, da er auf den Ort zeigt, an dem die Grundsatzmethode ihren Parameter platziert. Diese beiden Dateipositionen sind unabhängig, und jeder kann überall irgendwo in der Datei zeigen. Getting Die Größe einer Datei Die typische Möglichkeit, die Größe einer Datei zu erhalten, ist die Verwendung der C-Bibliotheksfunktion stat. Beachten Sie, dass der zweite Parameter auf stat ein Zeiger ist. Es liegt in Ihrer Verantwortung, den Speicher zu erstellen und zu verwalten, wo stat seine Ergebnisse platziert, und die Adresse dieses Speichers ist, was Sie als dieser zweite Parameter übergeben sollten. Das obige Beispiel zeigt die Verwendung einer lokalen Variablen, um die von stat. Öffnen einer Datei Ein Datei-Stream-Objekt kann auf zwei Arten geöffnet werden. Zuerst können Sie bei der Deklaration eines Objekts einen Dateinamen zusammen mit einem io-Modus-Parameter an den Konstruktor angeben. Alternativ können Sie nach dem Deklarieren eines Dateistromobjekts seine offene Methode aufrufen: Jeder Ansatz wird mit einem ifstream arbeiten. Ein stromaufwärts Oder ein fstream-Objekt. Normalerweise, wenn man Textdateien manipuliert, weglässt man den zweiten Parameter (den io-Modus-Parameter). Um jedoch Binärdateien zu manipulieren, sollten Sie immer den io-Modus angeben, einschließlich ios :: binary als einer der Modus-Flags. Für den Schreibvorgang für eine Datei verwenden Sie einen fstream. Hinweis: Wenn Sie ein GNU g Benutzer (Version 2.7.x oder früher) sind, dann verwenden Sie keine io-Modus-Flags beim Öffnen von ifstream-Objekten. Wegen eines Bugs in der GNU-libg-Implementierung werden die Flags nicht korrekt interpretiert. Wenn Sie unter Unix arbeiten, lassen Sie die io-Modus-Flags ganz aus, wenn Sie mit g unter MS-DOS arbeiten, dann verwenden Sie ein Fstream-Objekt. Dieser Hinweis gilt nur für Benutzer. Lesen aus einer Datei Um aus einem fstream - oder ifstream-Objekt zu lesen, verwenden Sie die Lesemethode. Diese Methode nimmt zwei Parameter an: Die Lese-Member-Funktion extrahiert eine vorgegebene Anzahl von Bytes aus dem gegebenen Stream und platziert sie in den Speicher, auf den der erste Parameter zeigt. Es liegt in Ihrer Verantwortung, das Gedächtnis zu erstellen und zu verwalten, wo gelesen wird, wird sein Ergebnis gesetzt, um sicherzustellen, dass es groß genug ist, um die Anzahl der benötigten Bytes zu halten. Die Bytes, die gelesen und nicht interpretiert werden, nimmt die Methode nichts über Zeilenendungen an, und die Lesemethode platziert nicht einen Nullterminator am Ende der eingelesenen Bytes. Wenn beim Lesen ein Fehler auftritt (z. Wenn du das Ende einer Datei ausliesst, wird der Stream in einen Fehlerzustand versetzt. Wenn das passiert, können Sie die gcount-Methode verwenden, um herauszufinden, die Anzahl der Zeichen, die tatsächlich gelesen wurden, und verwenden Sie die Clear-Methode, um den Stream in einen nutzbaren Zustand zurückzusetzen. Sobald ein Stream in einen Fehlerzustand übergeht, werden alle zukünftigen Leseoperationen fehlschlagen. Neupositionierung des Get-Pointer Um die Position des get-Pointer (die Datei-Leseposition) eines fstream - oder ifstream-Objekts zu ändern, verwenden Sie die seekg-Methode. Die Grundform dieser Operation nimmt einen einzigen Parameter: Ein Streampos ist im Wesentlichen ein unsigned long integer value. Seekg verschiebt den Zeiger auf die angegebene absolute Dateiposition (wobei 0 der Anfang der Datei ist). Beim Aufruf seekg vorsichtig sein, die Arten von Ihren Argumenten: Das Problem oben ist, dass Dateien relativ groß sein können, so Streampos können sehr große Zahlen zu halten. Aber oben, wenn blknumber über 63 ist. Wegen der Typen von blknumber und BLKSIZE (beide int s), auf einem PC kann ihr Produkt nur 16 Bits breit sein. Um dies zu korrigieren, stellen Konstanten zur Verfügung, die bei der Dateipositionierung verwendet werden, lange Mengen, oder dass alle Variablen, die bei einer solchen Positionierung verwendet werden, lange Mengen oder beides sind. Sie können die aktuelle Zeigerposition mit myFile. tellg () bestimmen, eine Methode ohne Parameter, die den Index des Zeigers auf den angegebenen Stream zurückgibt. Es gibt auch eine Variante von seekg, die es Ihnen erlaubt, eine Position relativ zum aktuellen Zeiger-Speicherort oder relativ zum Ende der Datei anzugeben. Schreiben in eine Datei Um in ein fstream oder ein externes Objekt zu schreiben, verwenden Sie die Schreibmethode. Diese Methode übernimmt zwei Parameter: Die Schreib-Member-Funktion schreibt eine vorgegebene Anzahl von Bytes auf den gegebenen Stream, beginnend an der Position des Put-Pointer. Wenn der Putzeiger am Ende der Datei aktuell ist, wird die Datei erweitert. Wenn der Putzeiger in die Mitte der Datei zeigt, werden die Zeichen in der Datei mit den neuen Daten überschrieben. Die Bytes, die geschrieben und nicht interpretiert werden, wird nach den Daten kein Wagenrücklauf hinzugefügt, und die Schreibmethode nimmt nicht an, dass am Ende der Bytes, die geschrieben werden, ein Nullterminator vorhanden ist. Wenn beim Schreiben ein Fehler auftritt (z. B. wenn Sie den Speicherplatz verlassen), wird der Stream in einen Fehlerzustand versetzt. Solche Fehler sind nicht so häufig wie Lesefehler und werden oft nicht geprüft. Neupositionierung des Put-Pointer Um die Position des Put-Pointer (die Datei-Leseposition) eines fstream - oder ofstream-Objekts zu ändern, verwenden Sie die seekp-Methode. Die Grundform dieser Operation nimmt einen einzigen Parameter: Ein Streampos ist im Wesentlichen ein unsigned long integer value. Seekp verschiebt den Putzeiger auf die angegebene absolute Dateiposition (wobei 0 der Anfang der Datei ist). Sie können die aktuelle Positionszeigerposition mit myFile. tellp () bestimmen, eine Methode ohne Parameter, die den Index des Putzeigers auf den angegebenen Stream zurückgibt. Es gibt auch eine Variante von seekp, die es Ihnen erlaubt, eine Position relativ zum aktuellen Positionszeigerort oder relativ zum Ende der Datei anzugeben. Lesen und Schreiben von komplexen Daten Obwohl die Lese - und Schreibmethoden einen char-Zeiger akzeptieren, besteht keine Voraussetzung dafür, dass die Daten, die Sie lesen und schreiben, in einem char-Array gehalten werden. Sie können komplexe Datenobjekte mit dem einfachen Typieren von Zeigern lesen oder schreiben: Closing a File Für alle Dateistromobjekte verwenden Sie: ofstream :: ofstream Der Name der Datei, die während des Builds geöffnet werden soll. Eine Ganzzahl, die Modusbits enthält, die als ios-Enumeratoren definiert sind, die mit dem bitweisen OR () - Operator kombiniert werden können. Der Parameter nMode muss einen der folgenden Werte haben: ios :: app Die Funktion führt einen Suchvorgang zum Ende der Datei aus. Wenn neue Bytes in die Datei geschrieben werden, werden sie immer an das Ende angehängt, auch wenn die Position mit der ostream :: seekp-Funktion verschoben wird. Ios :: ate Die Funktion führt eine Suche nach dem Ende der Datei aus. Wenn das erste neue Byte in die Datei geschrieben wird, wird es an das Ende angehängt, aber wenn nachfolgende Bytes geschrieben werden, werden sie in die aktuelle Position geschrieben. * :: in Wenn dieser Modus angegeben ist, dann die Originaldatei (wenn es Existiert) wird nicht abgeschnitten. ios :: out Die Datei wird zur Ausgabe geöffnet (impliziert für alle Gegenstände).ios :: trunc Wenn die Datei bereits vorhanden ist, wird ihr Inhalt verworfen. Dieser Modus ist impliziert, wenn ios :: out angegeben ist und ios :: ate. Ios :: app Und ios: in sind nicht angegeben. ios :: nocreate Wenn die Datei noch nicht existiert, ist die Funktion fails. ios :: noreplace Wenn die Datei bereits vorhanden ist, wird die Funktion fails. ios :: binary Öffnet die Datei im Binärmodus (die Standard ist Textmodus). Die Dateischutzspezifikation setzt standardmäßig auf die statische Ganzzahl filebuf :: openprot ein, die mit filebuf :: shcompat äquivalent ist. Die möglichen nProt-Werte sind: filebuf :: shcompat Kompatibilitätsfreigabe-Modus. Filebuf :: shnone Exklusiver Modus no sharing. filebuf :: shread Lesen Sie die Freigabe allow. filebuf :: shwrite Schreiben Sie die Freigabe erlaubt. Um die Dateien filebuf :: shread und filebuf :: shwrite zu kombinieren, verwenden Sie den logischen OR () - Operator. Ein Dateideskriptor, der von einem Aufruf zur Laufzeitfunktion zurückgegeben wird, öffnen oder sopen filedesc ist ein typedef äquivalent zu int. Zeiger auf einen zuvor reservierten Reservebereich der Länge nLength. Ein NULL-Wert (oder nLength 0) gibt an, dass der Stream ungepuffert wird. Die Länge (in Bytes) des Reservebereichs (0 ungepuffert). Die vier Konstrukteure sind:

Comments