|
Community
Szene & News
Locations
Impressum
|
Forum / Bits und Bytes
Prgrammiersprache C read/write

defg - 38
Fortgeschrittener
(offline)
Dabei seit 09.2007
32
Beiträge
|
|
Geschrieben am: 22.05.2009 um 17:57 Uhr
|
|
Hi,
ich hab mal ne frage,
ich möchte eine datei unter mit open kreiren und dann mit write beschreiben.
wenn ich es beschrieben habe und die datei dann später öffne und mir alles anzeigen will, kommt die datei immer nur als binär datei heraus.. daher kann ich nix erkenne.. warum?
hier mein quellcode!
ich hoffe ich könnt mir weiterhlelfen!
#include <unistd.h>
#include <fcntl.h> /* FILE Control */
#include <stdio.h> /* Standard I/O (printf ...) */
#define DUMMY_FILE "datei.txt"
int main(int argc, char *argv[])
{
int fd;
char dummy[] = DUMMY_FILE;
char *file;
char *buffer[10];
strcpy(buffer,"abcdefghij");
file = dummy;
fd = open(file, O_CREAT|O_RDWR,0644);
write(fd,buffer,sizeof(buffer));
close(fd);
return 0;
}
|
|
timothy78 - 47
Anfänger
(offline)
Dabei seit 05.2006
6
Beiträge
|
Geschrieben am: 22.05.2009 um 18:33 Uhr
Zuletzt editiert am: 22.05.2009 um 18:35 Uhr
|
|
Das Problem liegt mitunter hier:
Wenn ich das noch richtig in Erinnerung habe ist das ein Array mit 10 Elementen vom Typ "char *". Also Pointer auf char und nicht nur char. Ergo ist buffer insgesamt 80 Bytes groß.
Zitat: write(fd,buffer,sizeof(buffer));
Diese 80(!) Bytes (und nicht 10 wie du vielleicht wolltest) werden hier in die Datei geschrieben. Ergo sind die ersten 10 Zeichen o.k. und die restlichen 70 in "datei.txt" Schrott.
Ohne jetzt Deinen ganze Code zu Kommentieren wäre das eine Lösung:
Zitat:
int main(int argc, char *argv[])
{
int fd;
char dummy[] = DUMMY_FILE;
char *file;
char buffer[10];
strcpy(buffer,"abcdefghij");
file = dummy;
fd = open(file, O_CREAT|O_RDWR,0644);
write(fd,buffer,sizeof(buffer)/sizeof(char));
close(fd);
return 0;
}
Wobei bei
Zitat: write(fd,buffer,sizeof(buffer)/sizeof(char));
das sizeof(char) eigentlich überflüssig (das Ergebnis ist 1), aber sauberer.
|
|
Andi_71 - 55
Fortgeschrittener
(offline)
Dabei seit 04.2005
38
Beiträge
|
Geschrieben am: 22.05.2009 um 18:39 Uhr
Zuletzt editiert am: 22.05.2009 um 18:39 Uhr
|
|
Du hast jetzt einen String der Länge 10
strcpy kopiert aber 11 Zeichen, siehe Dokumentation zu strcpy:
The strcpy() function copies the string pointed to by src (including
the terminating `\0' character) to the array pointed to by dest. The
strings may not overlap, and the destination string dest must be large
enough to receive the copy.
Um nicht diese \0 mit in die Datei zu speichern würde ich die Länge mit strlen() ermitteln und nicht mit sizeof().
|
|
defg - 38
Fortgeschrittener
(offline)
Dabei seit 09.2007
32
Beiträge
|
|
Geschrieben am: 22.05.2009 um 18:50 Uhr
|
|
Zitat von timothy78: Das Problem liegt mitunter hier:
Wenn ich das noch richtig in Erinnerung habe ist das ein Array mit 10 Elementen vom Typ "char *". Also Pointer auf char und nicht nur char. Ergo ist buffer insgesamt 80 Bytes groß.
Zitat: write(fd,buffer,sizeof(buffer));
Diese 80(!) Bytes (und nicht 10 wie du vielleicht wolltest) werden hier in die Datei geschrieben. Ergo sind die ersten 10 Zeichen o.k. und die restlichen 70 in "datei.txt" Schrott.
Ohne jetzt Deinen ganze Code zu Kommentieren wäre das eine Lösung:
Zitat:
int main(int argc, char *argv[])
{
int fd;
char dummy[] = DUMMY_FILE;
char *file;
char buffer[10];
strcpy(buffer,"abcdefghij");
file = dummy;
fd = open(file, O_CREAT|O_RDWR,0644);
write(fd,buffer,sizeof(buffer)/sizeof(char));
close(fd);
return 0;
}
Wobei bei
Zitat: write(fd,buffer,sizeof(buffer)/sizeof(char));
das sizeof(char) eigentlich überflüssig (das Ergebnis ist 1), aber sauberer.
mhhh irgendwie haut der mir des immernoch als biär datie heaus.. kannst du mir des n bissl genauer erklären mit dene 80 bit!? irgendwie ist des komisch..
|
|
defg - 38
Fortgeschrittener
(offline)
Dabei seit 09.2007
32
Beiträge
|
|
Geschrieben am: 22.05.2009 um 18:53 Uhr
|
|
jetzt hat es funktioniert, wenn ich
write(fd,buffer,(sizeof(buffer)/sizeof(char*))) mache...
Aber warum durch sizeof(char*) teilen?.. des ist mir absolut nicht klar!
|
|
timothy78 - 47
Anfänger
(offline)
Dabei seit 05.2006
6
Beiträge
|
|
Geschrieben am: 22.05.2009 um 18:56 Uhr
|
|
Kann ich machen. Schreib mich einfach an ...
BTW: Lösche Deine Datei "datei.txt" mal und fürhre das Programm nochmal aus. Falls Du in Deinem Quellcode das "*" beim anlegen des Buffers gelöscht hast (char buffer[10]), dann sollte es gehen.
Um nicht zu sagen: Beim rausschreiben überschreibst du (so wie du es machst) die vorhandene Datei. Ist diese allerdings länger, als das was drinsteht, bleibt der (alte) Rest natürlich darin stehen.
|
|
Forum / Bits und Bytes
|