How To Append To File in C, Einsatz von Open in O_APPEND-Modus unter linux?
Dies ist ein Teil einer Hausaufgabe. Nun, ich konnte nicht alles, die Dinge in meine Hausaufgaben, damit habe ich gezogen ein snippet raus und begann zu spielen mit ihm, um herauszufinden, was falsch ist.
Unter linux in C ich versuche zu öffnen/erstellen Sie eine Textdatei, etwas dazu schreiben, schließen Sie es, öffnen Sie es in read/write und append-Modus, und fügen Sie alles das Ende der es (in diesem Beispiel der string "dude"). Wird nichts angehängt, aber, aber die write-Methode ist auch nicht werfen eine Fehlermeldung. Ich bin mir nicht sicher, was Los ist.
Hier der code:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#define BUFFSIZE 4096
int main(){
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
int fd = open("tempfile.txt", O_RDWR | O_CREAT, mode);
char buf[BUFFSIZE] = {'t', 'h', 'y', ' ', 'f', 'a', 'l', 'l'};
size_t n = sizeof(buf);
if(write (fd, buf, n) < 0){
printf("Error in write\n");
printf("%s", strerror(errno));
return 1;
}
close(fd);
int fd2 = open("tempfile.txt", O_RDWR | O_APPEND);
printf("appending dude:\n");
char buf2[6] = {',', ' ', 'd', 'u', 'd', 'e'};
size_t p = sizeof(buf2);
if(write (fd2, buf2, p) < 0){
printf("Error in write\n");
printf("%s", strerror(errno));
return 1;
}
char buf3[BUFFSIZE];
lseek(fd2, 0, SEEK_SET);
if(read (fd2, buf3, BUFFSIZE) < 0){
printf("Error in read\n");
printf("%s", strerror(errno));
return 2;
}
int i;
for (i = 0; i < strlen(buf3); ++i){
printf("%c", buf3[i]);
}
printf("\n");
close(fd2);
return 0;
}
Ich habe versucht, um die Möglichkeit auszuschließen, dass es unbedingt ein Problem mit Berechtigungen von messing mit ein paar verschiedene Kombinationen, ändern Sie den Modus variable, S_IRWXU | S_IRWXG | S_IRWXO, vorbei an der mode als ein drittes argument in meinem zweiten open-Anweisung, nur das öffnen der Datei im append-Modus in der zweiten open-Anweisung übergeben, die append-Modus als drittes argument in der zweiten open-Anweisung, etc.
Die besten, die ich tun kann, ist, öffnen Sie es in RDWR ohne das APPEND-Modus, und dann schreiben Sie direkt in den vorhandenen text... aber das ist nicht das, was ich will. Und der Hinweis, ich bin mir dessen bewusst, Dinge wie lseek, aber der Zweck ist hier streng mit der append-Modus, hinzufügen von text am Ende der Datei. Ich will nicht von lseek.
Irgendwelche Hinweise zu suchen? Ich bin mir sicher, dass es etwas offensichtlich, dass ich einfach nicht verstehen.
Vielen Dank.
InformationsquelleAutor Deranger | 2013-10-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Anzahl der bytes, die Sie versuchen zu schreiben ist nicht korrekt,
statt, die Sie tun sollten,
Ebenso tun Sie dies für andere schreiben und liest auch. Wenn Sie nicht schreiben
'\0'
in der Datei zu beenden, string, werden Sie nicht bekommen, wenn Sie Lesen Daten aus der Datei.Während des Lesens sollte man versuchen, bis die gesamte Datei gelesen wird, dh. Sie erhalten
EOF
.InformationsquelleAutor Rohan
Gut, ich habe nur versucht, Ihr Programm und haben eine Vorstellung davon, was schief läuft.
Grundsätzlich funktioniert es, aber mit einem glitch. Wenn Sie zuerst schreiben "dein fall" in die Datei, die Sie verwenden, eine
char
array von4096
bytes, und schreiben Sie das gesamte array in die Datei. Das heißt, Sie schreiben "deinen fall" ein, gefolgt von4088
Zeichen von random-nichts. Später, wenn Sie fügen Sie das Anhängen an die 4097th position weiter. Dies ist wahrscheinlich nicht das, was Sie zu tun beabsichtigte.Wenn Sie einfach
cat
die Datei, die Sie erstellen, Sie werden sehen, die erwartete Ausgabe "deinen fall, dude". Aber wenn Sie es Lesen, ganz in Ihrem code, Sie sind nur Lesen4096
Zeichen. Daher, der "dude" - Teil ist nie gelesen, das ist, warum Ihr Programm nie Ausgänge.Meine Lösung, die Sie brauchen, um Ihre array-Größe. Und wenn Sie Lesen, Lesen Sie in Brocken von sagen wir 100 oder 1000, bis Sie auf EOF (
read
wird -1 zurück).cat
ist ein Befehl auf einer linux-shell. Wenn Sie die bash verwenden, öffnen Sie einfach ein terminal, wechseln Sie in das Verzeichnis, wo das Programm Leben, und tuncat tempfile.txt
.Alles in Ordnung - ich habe es funktioniert, jetzt. Ich denke, dass beide Sie und Rohan sind korrekt, was du sagst, aber das hinzufügen der null-Zeichen zum beenden des array und mit strlen anstelle von sizeof als Rohan schlägt vor, gab mir genau die Ergebnisse, die ich suchte. Also werde ich upvote diese beiden Antworten wählen aber Rohan ist, als das, was eigentlich schon mein Problem. Vielen Dank für Eure Hilfe!
InformationsquelleAutor Nikhil
Es ist nur ein kleiner Fehler, müssen Sie ändern die
sizeof
Funktionstrlen
weil diesizeof
Funktion gibt die Größe des Arrays aber diestrlen
Funktion einfach nur wieder die Länge des Strings in dem array gespeichert!InformationsquelleAutor xingh1991
Hier ist der korrigierte code, müssen Sie auch die O_CREAT-flag zunächst erstellen Sie die Datei
InformationsquelleAutor Frank Mancini