16.24 Byte- und wide-orientierter Stream
Neben einem char steht Ihnen auch der Typ wchar_t für Breitzeichen (siehe Abschnitt 5.13, »Der Breitzeichen-Typ wchar_t«) zur Verfügung, um, abhängig von der Implementierung, erweiterte Zeichensätze darzustellen. Zwar werden in diesem Kapitel nur die Standard-Ein-/Ausgabefunktionen der Headerdatei <stdio.h> beschrieben, aber für breite Zeichen stehen in der Headerdatei <wchar.h> immer entsprechende Gegenstücke zu Verfügung. Um beispielsweise einen String zeilenweise in einen Stream zu schreiben, steht Ihnen in der Headerdatei <stdio.h> die Funktion fgets() zur Verfügung. Das entsprechende Gegenstück für breite Zeichen aus der Headerdatei <wchar.h> unterscheidet sich lediglich durch den Namen und lautet fgetws().
Das Öffnen einer Datei erfolgt bei byte- und wide-orientierten Streams immer auf dieselbe Art und Weise. Erst der erste Zugriff auf eine Datei entscheidet, ob dieser byte- oder wide-orientiert erfolgt. Dies hängt natürlich davon ab, ob Sie die byte-orientierten Funktionen aus <stdio.h> oder die wide-orientierten aus <wchar.h> verwenden.
Wissen müssen Sie auf jeden Fall, falls Sie einen wide-orientierten Stream verwenden, dass die Zeichen als Multibyte-Zeichen (siehe den gleichnamigen Abschnitt 5.14) in der Datei gespeichert werden. Um die entsprechenden Konvertierungen von Breitzeichen in Multibyte-Zeichen und umgekehrt müssen Sie sich nicht kümmern, das machen die Funktionen für Sie.
Jeder wide-orientierte Stream hat außerdem ein Objekt vom Typ mbstate_t, in dem der Status der Konvertierung gespeichert wird. Diese Informationen werden benötigt, um korrekte Konvertierungen zwischen Breitzeichen und Multibyte-Zeichen und umgekehrt durchzuführen. Mit diesem Status wird die Funktionsweise der Konvertierung festgelegt. In diesem Konvertierungsstatus wird auch die Position innerhalb des Multibyte-Zeichens gespeichert, sodass Sie mithilfe von mbstate_t auch ohne Probleme die Dateiposition mit den Funktionen fgetpos() und fsetpos() abfragen bzw. setzen können.
Wollen Sie wissen, ob ein Stream byte- oder wide-orientiert ist, können Sie die Funktion fwide() aus der Headerdatei <wchar.h> verwenden. Mit dieser Funktion können Sie außerdem auch die Stream-Orientierung direkt setzen. Gewöhnlich macht man dies gleich nach dem Öffnen der Datei. Nach dem Setzen der Orientierung mit fwide() kann diese nicht mehr geändert werden. Die Orientierung lässt sich aber nach einem Aufruf von freopen() wieder löschen. Ohne einen Aufruf von fwide() wird, wie bereits erwähnt, die Orientierung implizit dadurch festlegt, ob die erste Schreib- oder Leseoperation byte- oder wide-orientiert ist. Ein einfaches Beispiel hierzu:
/* wideorientiert.c */ #include <stdio.h> #include <stdlib.h> #include <wchar.h> int main() { FILE *fp; int ret; wchar_t wStr[] = L"Ein einfaches Beispiel für Breitzeichen"; fp = fopen("testfile.txt", "w+"); if( NULL == fp ) { printf("Konnte Datei nicht öffnen\n"); exit(EXIT_FAILURE); } // wide-orientiert setzen = 1 ret = fwide( fp, 1 ); if( ret <= 0 ) { fprintf( stderr, "Konnte nicht auf Breitzeichen umstellen\n"); exit(EXIT_FAILURE); } // Die Breitzeichen schreiben fputws( wStr, fp ); return EXIT_SUCCESS; }
Hinweis |
Eine Übersicht zu den Funktionen der Headerdatei <wchar.h> finden Sie in Anhang B.23. |
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.