[C] Copy

Hallo,
ich wollte grade nen Low Level Programm in C schreiben, was eine Datei kopiert. Könnt ihr mir sagen wo der Fehler ist? Ich star schon ne Weile drauf und find nichts... Bei read und write die 5 dient nur zu Testzwecken.

Code:
int main (){
    if(source_fd = open("test.dat",O_RDONLY) < 0){
        printf("Fehler beim oeffnen der Datei.\n");
    }
    if(dest_fd = creat("test1.dat",S_IWUSR | S_IRUSR) < 0){
        printf("Fehler beim erstellen der Datei.\n");
    }
    if(read(source_fd,copy_buffer, 5)< 0){
        printf("Fehler beim Lesen der Datei.\n");
    }
    if(write(dest_fd,copy_buffer, 5)< 5){
        printf("Fehler beim Lesen der Datei.\n");
    }
    if(close(source_fd)< 0){
        printf("Fehler beim Schliessen der Datei.\n");
    }
    printf("Done.");
    return 0;
}
 
Okay... Ich konnte mir meine Frage, wie so oft in letzter Zeit, doch selbst beantworten...

Code:
int copy(char *source, char *target)

{

    int in,out,count;
    char buffer[MAXBYTES];
    if((in=open(*source ,O_RDONLY)) == -1)
        printf("Fehler open %s\n", argv);
    if((out=open(*target, O_WRONLY | O_CREAT)) == -1)
        printf("Fehler open %s\n", argv);
    while(count = read(in, buffer, MAXBYTES))
        write(out,buffer,count);
    close(in);
    close(out);
    return 0;



}
 
da source_fd und dest_fd immer 0 sein werden, wenn es beim öffnen der dateien keinen fehler gibt, wird das programm versuchen von stdin zu lesen und auf stdin zu schreiben ...

ich denke nicht, dass dies beabsichtigt ist, und schlage daher vor, dass du in zukunft mit zuweisungen in einem "if" etwas vorsichtiger bist ... ;)



was passiert hier?
Code:
[FONT=monospace]if(source_fd = open("test.dat",O_RDONLY) < 0)[/FONT]

wird entsprechend der operator priorität ausgewertet, und entspricht folgendem etwas verständlicherem ausdruck:
Code:
[FONT=monospace]if(source_fd = [B]([/B]open("test.dat",O_RDONLY) < 0[B])[/B])[/FONT]
während du eigentlich folgenden ausdruck wolltest:
Code:
[FONT=monospace]if([B]([/B]source_fd = open("test.dat",O_RDONLY)[B])[/B] < 0)[/FONT]

//edit: ... da warst du doch glatt schneller beim tippen ;)
 
;)

[EDIT1]: Ich hab noch ne Frage, wie bekomme ich etwas dergleichen hin:
(ich weiß, dass es nicht geht und auch warum...)
Also ich möchte den Pfad ./*foldername/*filename in nem String speichern.

Code:
char path[PATHSIZE] = strcat(strcat(strcat("./",(*foldername)),"/"),(*filename));

[EDIT2]: Ich bin gerade dabei nen Papierkorb zu machen... und das Verscheiben einer Datei ind en Papier korb löse ich im Moment so:

Code:
int put_file(char *foldername, char *filename)
{
	setup_trashcan(*foldername);
	copy(*filename,strcat(strcat(strcat("./",(*foldername)),"/"),(*filename)));
	return EXIT_SUCCESS;
}

Und ja der Papierkorb soll im gleichen Verzeichnis liegen, wo das Programm ausgeführt wird.
 
Zuletzt bearbeitet:
Kann mir jemand sagen, wie ich das Folgende in c schreibe?

Code:
char path[pathsize] = FOLDERPATH+*datei;

Die Datei wird als Parameter der main Methode übergeben und befindet sich im gleichen Verzeichnes wie der Benutzer aber nicht in FOLDERPATH (Konstante).
 
Hi!
*path referenziert den 1.Buchstaben des Strings, NICHT den string selbst.
Dieser ist ein Chararray mit einem zusätzliche NULL-character('\0').
Die Befehle welche du suchst lauten strlen und strcat.
Mit '+' kannst du in C/C++ Strings nicht kontatinieren.
Ist also anders als in Java.
Ich hoffe mal das pathsize eine Zahl ist und kein String.
Assoziative Arrays wie in PHP gibt es in C nicht.
Dafür müsstest du auf den Map-Container in der STL von C++ zurrückgreifen.

mfg

sw33t
 
Zuletzt bearbeitet:
@sw33tlull4by: Ich nehme an du hast die Posts davor nicht gelesen. Ich weiß, dass der Pointer *datei (laut Deklaration) auf ein Char zeigt. Ich habe nur angenommen, dass strcat mir die Arbeit abnimmt und bis exklusiv '\0' einliest. Bei "./" steht schließlich auch ein '\0' am Ende.
Trotzdem danke.
 
da es sich wohl um nullterminierte strings handelt, bist du in der lage zu berechnen, wie groß ein buffer sein muss, damit du den string da rein schreiben kannst, ergo kannst du dir einen solchen buffer mittels malloc anlegen, und den string darin zusammensetzen ...

zu diesem zweck möchtest du evtl die funktion sprintf() in augenschein nehmen (im falle von c99 vermutlich lieber snprintf(), oder falls es gar die gnu extension sein darf asprintf() ... letztere alloziert den benötigten speicher selbst ... )
 
Zurück
Oben