write() unter linux



  • Guten Abend zusammen,

    ich verwende write um ein int in eine Textdatei zu schreiben

    int userid = getuid();
    ...
    write(fd, &userid, sizeof(userid));
    

    Die Textdatei wird anschließend unbrauchbar, und auch wenn ich den int in einer char[] verpacke kann ich die datei hinterher nicht mehr öffnen. komischerweise funktioniert es, wenn ich einen *char einsetze.
    Hab irgendwas von fsync(fd) gelesen, bin aber leider nicht weiter gekommen. Kennt sich da evt. jemand aus?

    vielen dank im voraus


  • Mod

    Das klingt, als hättest du ziemlich wilde Vorstellungen über Datentypen und ihre Repräsentation. Was meinst du mit "unbrauchbar"? Erstelle ein vollständiges Minimalbeispiel; beschreibe, was du von dem Beispiel erwartest und was stattdessen passiert.



  • Ich weiß wie die unterschiedlichen primitiven Datentypen aufgebaut sind, im Grunde genommen nichts anderes als bit-folgen mit unterschiedlich allokierten speicherbereich, ich weis auch das int 1 != ascii 1 ist.
    ich kann aber nicht hinter write() sehen und weiß nicht genau was es tut.
    also der mit /* */ ausgeklammerte bereich bei //Dateischreiben sorgt dafür, das sich die textdatei nicht mehr öffnen lässt.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <fcntl.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include "mylib.h"
    
    int main(int argc, char *argv[]){
    
    	int userid, fd;  //Dateideskriptor
    
    	char *buffer, *datafile, *ch_userid;	
    	size_t n;
    	buffer = (char *)ec_malloc(100);
    	datafile = (char *) ec_malloc(30);
    	ch_userid = (char *) ec_malloc(10);
    	strcpy(datafile, "/home/xxxxxx/notes");
    
    	if(argc < 2)
    		usage(argv[0], datafile);
    
    	strcpy(buffer, argv[1]);
    
    	printf("[DEBUG] buffer @ %p: \'%s\'\n", buffer, buffer);
    	printf("[DEBUG] datafile @ %p: \'%s\'\n", datafile, datafile);
    
    	//Datei öffnen
    	fd = open(datafile, O_WRONLY|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR);
    	if(fd == -1)
    		fatal("in main() while opening file");
    	printf("[DEBUG] file descriptor is %d\n", fd);
    	userid = getuid(); //REALE USER ID ERMITTELN
    	//n = IntToString(ch_userid, userid);
    	//printf("CH_USERID: %s\n",ch_userid);
    
    	//Datei schreiben
    	/*if(write(fd, &userid, sizeof(userid)) == -1)
    		fatal("in main() while writing userid to file");
    	write(fd,"\n",1);*/
    
    	if(write(fd, buffer, strlen(buffer)) == -1)
    		fatal("in main() while writing buffer to file");
    	write(fd, "\n", 1);
    
    	//Datei schließen
    	if(close(fd) == -1)
    		fatal("in main() while closing file");
    	close(fd);
    	printf("Note has been saved\n");
    	free(buffer);
    	free(datafile);
    	return 0;
    }
    

  • Mod

    Kakarott schrieb:

    sorgt dafür, das sich die textdatei nicht mehr öffnen lässt.

    Erzähl mal mehr!

    Klingt nämlich eher so, als hättest du ein Problem bei der Nutzung deines Computers.



  • sobald ich mit dem ausgeklammerten code text in die datei schreiben möchte wird der datentyp der textdatei unbekannt, lässt sich mit gedit nicht mehr öffnen (was ohne diesen part nicht der fall ist) es nützt dann auch nichts mehr die zeichenkodierung zu ändern


  • Mod

    Kakarott schrieb:

    sobald ich mit dem ausgeklammerten code text in die datei schreiben möchte wird der datentyp der textdatei unbekannt,

    Klar, es ist hinterher ja auch keine Textdatei mehr, nachdem du deinen int binär hinein geschrieben hast.

    lässt sich mit gedit nicht mehr öffnen (was ohne diesen part nicht der fall ist) es nützt dann auch nichts mehr die zeichenkodierung zu ändern

    Dann benutz eben ein geeignetes Programm. Gedit gehört der rosa Ponyhof-Fraktion der Texteditoren an und lässt seine Nutzer nicht einmal solche "gefährliche" Dinge tun, wie eine nicht-Textdatei zu öffnen 🙄



  • kann mir nicht einer sagen wie ich die zahl richtig in die textdatei bekomme, ohne es zu schrotten.


  • Mod

    Kakarott schrieb:

    kann mir nicht einer sagen wie ich die zahl richtig in die textdatei bekomme, ohne es zu schrotten.

    Was meinst du denn mit "richtig"? Die Zahl ist drin. Halt nicht als menschenlesbarer Text, was dir aber auch klar sein sollte, wenn folgendes Zitat stimmen sollte:

    Kakarott schrieb:

    Ich weiß wie die unterschiedlichen primitiven Datentypen aufgebaut sind, im Grunde genommen nichts anderes als bit-folgen mit unterschiedlich allokierten speicherbereich, ich weis auch das int 1 != ascii 1 ist.



  • Hallo nochmals, ja wie gesagt ich habe bereits versucht den integer in ein *char zu packen aber komme nach wie vor zum gleichen resultat, textdatei lässt sich nicht mehr öffnen. Hier meine funktion itostr, der test mit printf gibt ja auch das richtige resultat aus, getestet habe ich mit und ohne abschließendes '\0'...

    ...
    ch_userid = itostr(ch_userid, userid);
    	printf("CH_USERID: %s\n",ch_userid);
    
    	//Datei schreiben
    	if(write(fd, ch_userid, sizeof(ch_userid)) == -1)
    		fatal("in main() while writing userid to file");
    	write(fd,"\n",1);
    ....
    
    char *itostr(char *s, int x){
    
    	int i,j;
    	int val = x;
    	char c;
    	for(i=0;val!=0;i++,val/=10){
    		s[i] = val%10+'0';
    	}
    
    	for(j=0;j<strlen(s)/2;j++){
    		c=s[j];
    		s[j] = s[(strlen(s)-1)-j];
    		s[(strlen(s)-1)-j] = c;
    		printf("%s\n",s);
    	}
    
    	return s;
    }
    


  • Ok habe nun eine lösung gefunden, habe die größe von ch_userid in write nicht mit sizeof(wobei 8 raus kommt) sondern mit strlen(kommt 4) angegeben.


  • Mod

    Kakarott schrieb:

    Ok habe nun eine lösung gefunden, habe die größe von ch_userid in write nicht mit sizeof(wobei 8 raus kommt) sondern mit strlen(kommt 4) angegeben.

    Das ist totaler Unfug.

    Weißt du überhaupt, was write macht?



  • eben nicht, das habe ich versucht die ganze zeit zu erklären ich weis nicht was write macht

    ich kann aber nicht hinter write() sehen und weiß nicht genau was es tut.

    wenn es totaler quatsch ist wieso funktioniert es dann, habe nun alles sauber abgetippt ch_userid reallokiert usw. es funktioniert einwandfrei


  • Mod

    edit: Hilf dir doch selber.



  • Mein Problem war es, dass ich die Textdatei nicht öffnen konnte weil ich write falsch verwendet hab. Ja ich benutze es zum ersten mal und wenn ich es nicht ausprobiere komme ich auch nicht drauf wie ich es verwenden soll, oder willst du mir sagen dass du alles konntest ohne jemals einen Fehler gemacht zu haben. Aber anscheinend bist du auch nicht besonders kompetent in C, sonst würdest du mindestens einen konstruktiven Beitrag abgeben und nicht versuchen mich ständig zu denunzieren.

    Danke für die Hilfe


  • Mod

    Klar. 🙄



  • Verwende doch gleich fprintf, um deine ints da rein zu schreiben 😉



  • hallo roflo, ja du hast recht, mir geht es darum neue Dinge zu verstehen. Natürlich suche ich zunächst im web aber man findet nun mal nicht zu allem eine Antwort vor allem nicht auf deutsch. Ich weiß zwar immer noch nicht warum die Datei nicht zu öffnen war aber jetzt weiß ich zumindest wie ich die Funktion richtig verwenden kann.



  • Englisch sollte für dich als Programmierer eh kein Problem sein 😉



  • an sich nicht, aber Fachliteratur ist dann doch meist schwierig zu verstehen 😃



  • buch macht kluch


Log in to reply