Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

[C] Copy

Diskussion: [C] Copy im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Hallo, ich wollte grade nen Low Level Programm in C schreiben, was eine Datei kopiert. Könnt ihr mir sagen ...

Antwort
Alt 01.11.10, 09:55   #1 (permalink)
 
Registriert seit: 19.07.07
ddeldip Leistung: Facit NTK
Likes: 1
Standard [C] Copy

Anzeige

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;
}
ddeldip ist offline   Mit Zitat antworten
Alt 01.11.10, 15:29   #2 (permalink)
Themenstarter
 
Registriert seit: 19.07.07
ddeldip Leistung: Facit NTK
Likes: 1
Standard

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;



}
ddeldip ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 01.11.10, 15:36   #3 (permalink)
Member of Honour
 
Benutzerbild von GrafZahl
 
Registriert seit: 28.05.10
GrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: Opteron
Likes: 210
Standard

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:
if(source_fd = open("test.dat",O_RDONLY) < 0)

wird entsprechend der operator priorität ausgewertet, und entspricht folgendem etwas verständlicherem ausdruck:
Code:
if(source_fd = (open("test.dat",O_RDONLY) < 0))
während du eigentlich folgenden ausdruck wolltest:
Code:
if((source_fd = open("test.dat",O_RDONLY)) < 0)
//edit: ... da warst du doch glatt schneller beim tippen
__________________
Code:
:(){ :|:& };:
Veritas Aequitas
GrafZahl ist offline   Mit Zitat antworten
Alt 01.11.10, 23:22   #4 (permalink)
Themenstarter
 
Registriert seit: 19.07.07
ddeldip Leistung: Facit NTK
Likes: 1
Standard



[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.

Geändert von ddeldip (02.11.10 um 11:58 Uhr)
ddeldip ist offline   Mit Zitat antworten
Alt 04.11.10, 08:50   #5 (permalink)
Themenstarter
 
Registriert seit: 19.07.07
ddeldip Leistung: Facit NTK
Likes: 1
Standard

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).
ddeldip ist offline   Mit Zitat antworten
Alt 04.11.10, 09:57   #6 (permalink)
sw33tlull4by
Guest
 
Likes:
Standard

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

Geändert von sw33tlull4by (04.11.10 um 10:00 Uhr)
  Mit Zitat antworten
Alt 04.11.10, 10:25   #7 (permalink)
Themenstarter
 
Registriert seit: 19.07.07
ddeldip Leistung: Facit NTK
Likes: 1
Standard

@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.
ddeldip ist offline   Mit Zitat antworten
Alt 04.11.10, 22:00   #8 (permalink)
Member of Honour
 
Benutzerbild von GrafZahl
 
Registriert seit: 28.05.10
GrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: Opteron
Likes: 210
Standard

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 ... )
__________________
Code:
:(){ :|:& };:
Veritas Aequitas
GrafZahl ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » [C] Copy
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61