2010-01-05 13 views
11

Ich möchte den "cp" Befehl von Linux umschreiben. Also wird dieses Programm wie #./a.out originalfile copiedfile funktionieren. Ich kann die Datei öffnen, neue Datei erstellen, aber kann die neue Datei nicht schreiben. Nichts ist geschrieben. Was könnte der Grund sein?Wie schreibe ich eine Datei mit C in Linux?

Der aktuelle C-Code ist:

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 

int main(int argc,char *aa[]){ 
    int fd,fd1; 
    char buffer[100]; 

    if(argc!=3){ 
     printf("Usage : ./a.out <original> <copy> \n"); 
     return -1; 
    } 

    fd=open(aa[1],O_RDONLY,S_IRUSR); 
    if(fd==-1){ 
     printf("file not found.\n"); 
     return -1; 
    } 
    fd1=open(aa[2],O_CREAT | O_WRONLY,S_IRUSR); 
    if(fd1!=-1){ 
     printf("file is created.\n"); 
    } 
    ssize_t n; 
    while(n=read(fd,buffer,50)){ 
     write(fd1,buffer,n); 
     printf("..writing..\n"); 
    } 
    close(fd); 
    close(fd1); 
} 
+1

Unbenutzte Variable fd2; Vergessen Sie nicht zu überprüfen, dass write alles schreibt, was Sie erwartet haben; Verwenden Sie keine Zuweisungen als Bedingungen (verwenden Sie GCC - Wall); es ist immer noch besser, einen Wert von main() zurückzugeben, obwohl C99 (irrtümlicherweise) Ihnen erlaubt, den Rückgabewert main() zu verlassen. Ihre Fehlermeldung für FD1 ist falsch; Sie beenden nicht, wenn es auf FD1 fehlschlägt. Sie könnten sizeof (buffer) anstelle von 50 verwenden, was halb so groß ist wie der Puffer. Fehler werden klassisch in stderr geschrieben, nicht in stdout. Ihre Schleife führt zu Problemen, wenn das Lesen fehlschlägt (negativer Wert), im Gegensatz zur Rückgabe von nichts. –

+0

Sie haben Ihren Code einfach auf meinen Rechner kopiert und eingefügt, mit gcc kompiliert und es funktioniert einwandfrei. – Dipstick

+0

Oh, etwas Wunder ist passiert.Aufgrund deines Kommentars habe ich versucht, die Datei an einen anderen Ort zu verschieben und erneut zu testen. Es klappt!!! Ich danke dir sehr. – Devyn

Antwort

12

Sie schreiben müssen(), um die read() Daten in die neue Datei:

ssize_t nrd; 
int fd; 
int fd1; 

fd = open(aa[1], O_RDONLY); 
fd1 = open(aa[2], O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR); 
while (nrd = read(fd,buffer,50)) { 
    write(fd1,buffer,nrd); 
} 

close(fd); 
close(fd1); 

Update: hinzugefügt die richtige öffnet ...

Btw, kann die O_CREAT ODER-verknüpft werden (O_CREAT | O_WRONLY). Sie öffnen tatsächlich zu viele Dateizugriffsnummern. Mach einfach das Öffnen einmal.

+0

Hallo, danke für die Antwort. Ich habe meinen Post mit neuem Code bearbeitet. Ich habe versucht, wie du gesagt hast, aber immer noch nicht funktioniert. Nichts wird in eine neue Datei geschrieben. Bitte hilf mir! – Devyn

+0

Aktualisiert meine Post, hoffentlich ist das ein wenig besser ... – dlamotte

+0

Es tut mir leid, aber immer noch nicht funktioniert. Ich habe einen String in die While-Schleife gelegt und gezeigt, dass While-Loop nur einmal funktioniert hat. :( – Devyn

2

Sie haben als readwrite in derselben Schleife zu tun.

7

Zunächst einmal ist der Code, den Sie geschrieben haben, nicht tragbar, auch wenn Sie es zur Arbeit bekommen. Warum OS-spezifische Funktionen verwenden, wenn es eine vollkommen plattformunabhängige Vorgehensweise gibt? Hier ist eine Version, die nur eine einzige Headerdatei verwendet und auf jede Plattform portierbar ist, die die C-Standardbibliothek implementiert.

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    FILE* sourceFile; 
    FILE* destFile; 
    char buf[50]; 
    int numBytes; 

    if(argc!=3) 
    { 
     printf("Usage: fcopy source destination\n"); 
     return 1; 
    } 

    sourceFile = fopen(argv[1], "rb"); 
    destFile = fopen(argv[2], "wb"); 

    if(sourceFile==NULL) 
    { 
     printf("Could not open source file\n"); 
     return 2; 
    } 
    if(destFile==NULL) 
    { 
     printf("Could not open destination file\n"); 
     return 3; 
    } 

    while(numBytes=fread(buf, 1, 50, sourceFile)) 
    { 
     fwrite(buf, 1, numBytes, destFile); 
    } 

    fclose(sourceFile); 
    fclose(destFile); 

    return 0; 
} 

EDIT: Die glibc reference dies zu sagen hat:

Im Allgemeinen Sie mit mit Hilfe von Streams bleiben sollte, anstatt Deskriptoren Datei, es sei denn, es einige bestimmte Operation ist was Sie tun möchten, dass kann nur für einen Dateideskriptor ausgeführt werden. Wenn Sie ein Anfänger-Programmierer sind und sind nicht sicher, was Funktionen, verwenden wir vorschlagen, dass Sie auf den formatiert Eingabefunktionen konzentrieren (siehe Formatiert Input) und formatierte Ausgabe Funktionen (Formatierte Ausgabe sehen).

Wenn Sie Portabilität betroffen sind Ihrer Programme auf anderen Systemen als GNU, sollten Sie sich auch bewusst sein, dass Filedeskriptoren sind nicht als tragbare als Streams. Sie können ein beliebiges System läuft ISO C erwarten Ströme zu unterstützen, aber nicht-GNU-Systeme können nicht Datei Deskriptoren überhaupt, oder sie können nur implementieren eine Teilmenge der GNU Funktionen, die arbeiten auf Datei Deskriptoren unterstützen. Die meisten der Datei- Deskriptorfunktionen in der GNU -Bibliothek sind jedoch im POSIX.1 -Standard enthalten.

+0

Ich würde mich für Feed interessieren zurück auf warum genau ich auf diesem einen downvoted wurde ... –

+0

Ich denke, du machst einen guten Punkt über die Verwendung von Streams ... (Ich habe dich nicht abgestimmt), aber ich werde dich zurück auf Null bringen. – dlamotte

+0

Der Downvote selbst stört mich überhaupt nicht, es ist das _why_, das mich interessiert. Feedback, ob positiv oder negativ, hilft mir, mich zu verbessern. Wenn ich das tun kann, während ich (hoffentlich) anderen gleichzeitig behilflich bin, nichts dergleichen. –

Verwandte Themen