Ungepuffertes Schreiben in eine Datei
-
Hallo zusammen,
ich habe ein kleines aber widerspänstiges Problem. Und zwar möchte ich eine Funktion anlegen, mit der ich ungepuffert (also mit open, write usw. ) in eine Datei schreiben kann.
Die Funktion bekommt als Parameter den Namen einer anzulegenden Datei und eine einfache Zahl, die in diese Datei zu schreiben ist.So siehts aus:
/* Funktion zum Erzeugen einer Datei, in die die Semaphoren-ID geschrieben wird */ int erzeuge_datei ( const char * datei_name, int sem_id ) { int datei_descriptor = 0; char uebergabe_string[3]; int schluessel = sem_id; if ( ( datei_descriptor = open ( datei_name , O_CREAT | O_EXCL | O_WRONLY, S_IRUSR | S_IWUSR ) ) == -1 ) { perror ( "Fehler beim Erzeugen der Datei! \n" ); exit ( errno ); } sprintf ( uebergabe_string, "%d", schluessel ); /*{ perror ( "Fehler bei erzeugen eines Strings \n" ); exit ( errno ); }*/ if ( ( write ( datei_descriptor,uebergabe_string , 3 ) ) == -1 ) { perror ( "Fehler beim beschreiben der Datei! \n" ); exit ( errno ); } close ( datei_descriptor ); return ( 1 ); }
Wenn ich die Funktion aufrufe, erhalte ich die Fehlermeldung: Fehler beim beschreiben der Datei! \n : Bad file descriptor !!
Wenn ich die Zeile mit dem sprintf allerdings rausnehme, und die Zahl (sem_id ) direkt in die Datei schreibe, gibt es dieses Problem nicht. Klar daß dann dabei nicht das herauskommt, was man will. In der Datei steht dann ein einfaches kleines 's' was ich auch nicht verstehe ( ach ich sollte noch sagen, daß ich immer eine 42 als Zahl übergebe ). Aber die 42 ist nicht der ASCII-Code für ein kleines 's'.Weiter ist auch noch zu vermerken, daß die in der Funktion erzeugte Datei nicht mit dieser Funktion gelöscht werden kann:
void loesche_datei ( const char * datei_name ) { if ( ( remove ( "datei_name" ) ) == -1 ) { perror ( "Fehler beim Loeschen der Datei! \n" ); exit ( errno ); } }
<seufz> was habe ich falsch gemacht, was übersehen </seufz>
Gruss Christian
-
Leider kann ich dir nicht sagen, warum das nicht funktioniert.
Warum ist es so wichtig, dass es ungepuffert geschieht?
Könntest du nicht einfach C++-Filestreams benutzen?ofstream out(datei_name); out << schluessel; out.close();
Weiß nicht ob bzw. wie man bei fstream ungepuffertes Schreiben ermöglichen kann.
Aber du könntest es ja mal mit fopen & Co. versuchen, einfach den Puffer auf NULL setzen um ungepuffert zu schreiben:setbuf(fp,NULL);
-
Naja ich habe ja extra geschrieben, daß ich es mal mit open, read und write machen wollte. Sicher mit fopen, fprintf und fscanf geht das viel komfortabler, aber man muß halt auch mal was neues ausprobieren! Ich habe das Problem inzwischen gelöst (mit Hilfe von www.debianforum.de). Es war die Grösse des Puffers, die hatte ich einfach zu klein dimensioniert.
Diese Änderungen haben den "Durchbruch" gebracht:
char uebergabe_string[12] = " "; .... if ( ( write ( datei_descriptor, uebergabe_string , 12 ) ) == -1 )
Gruss Christian
-
-
Ansonsten solltest du mal mit gcc -g übersetzen und den ddd fragen
-
Ich vermute mal, dein Problem ist die Größe des reservierten Speicherbereiches - in ein char buf[3] kannst du nur zwei Zeichen (plus \0) reinpacken, wenn dein String länger wird, flutest du damit den Speicherbereich der benachbarten Variablen (und das ist anscheinend der file-Deskriptor).
(btw mußt du nicht unbedingt den vollen String per write kopieren - du kannst auch vorher per strlen() bestimmen, wie groß deine Daten tatsächlich sind)