• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

write und read Problem

deetee

Newbie
Hallo,

habe ein Problem mit dem Schreiben und Lesen von Dateien. Wieso macht folgender Code keinen Eintrag in meine Datei?

Code:
        int sum;
	fd = open(fs1.title, O_RDWR|O_CREAT, 0640);
	sum = 3;
	sum = write(fd, &sum, 4);
	lseek(fd, 0L, SEEK_SET);
	sum = read(fd, &sum, 4);
	printf("sum: %d\n", sum);
	close(fd);

Das printf() gibt 4 aus, also read klappt ohne Fehler. write() und lseek übrigens auch, habe ich getestet.

Sieht jemand meinen Fehler?

EDIT:

also ich habe mal statt int ein char in die Datei geschrieben, das klappt. Mit dem selben Code.

Mit int ist der Dateizeiger zwar auch um eine Stelle vom Anfang verschoben, aber man sieht keine Zahl. Weiß jemand warum?
Zumal das Auslesen mit int ja auch nicht klappt, also read() wird zwar richtig ausgeführt, aber es wurde scheinbar nichts ausgelesen.
 
Aber wird nicht erst die Funktion ausgeführt nachdem der Rückgabewert geliefert wird?

Demnach wird der Wert erst gesetzt wenn man &sum schon geschrieben hat oder?


Bitte um Belehrung wenn ich falsch liege ...

Grüße Jenna
 
JennaJamson schrieb:
Aber wird nicht erst die Funktion ausgeführt nachdem der Rückgabewert geliefert wird?
Äh, und wer macht dann den Rückgabewert, wenn nicht die Funktion?

Es ist schlicht "undefined behavior" wenn auf beiden Seiten eine Variable verändert wird. Dazu zählt auch
Code:
string1[i++] = string2[i++]; oder
string1[i++] = string2[i]; oder
string1[i] = string2[i++];
In solchen Fällen ist nicht genau gesagt, welche der beiden []-Klammern zuerst ausgewertet wird. Du kannst aber davon ausgehen, dass, wenn sie ausgewertet sind, die Zuweisung auch (entsprechend der Auswertungsreihenfolge) funktioniert.
Es gibt noch Fälle, die man schwerer erkennt:
Code:
char s[] = "A";
printf("%s %s\n", modify(s), modify(s));

static char *modify(char *s) {
    return ++(*s);
}
Entweder erhält man hier "B C" oder "C B", da die Auswertungsreihenfolge vom ","-Operator auch nicht festgelegt ist (in Perl dagegen schon -- nur so BTW).
 

Morlon

Member
Woran siehst du eigentlich, dass er nichts in deine Datei schreibt?
Mal als Dateinamen eine nicht existente Datei angegeben?

Der Code ist eigentlich richtig, wenn man Variablen sparen möchte, nur bekommst du so nicht raus, was er gelesen hat, sondern nur, dass er etwas gelesen hat.

Wenn du nach dem write sum ausgibst, siehst du bei dir auch, ob er was geschrieben hat.

Ich würde aber lieber wie schon gesagt, noch eine Hilfsvariable nehmen, die die Ergebnisse von read und write verarbeitet.

MfG
 
Oben