PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Argument bergabe



Debuger
14-01-2002, 09:06
Folgendes Programm sollte mit Hilfe von Argumenten eine Datei öffnen und rückwärts ausgeben. Falls 2 Argumente angegeben wurden sollte es den Text der Quelldatei rückwärtsrum in die Zieldatei schreiben.
Die Quell und Zieldatei werden als Argumente angegeben.

Das klappt noch nicht ganz, kann mir jemand helfen??

#include <stdio.h>
#include <stdlib.h>


int main(int argc, char* argv[]) {

FILE* quelldatei=NULL;
FILE* zieldatei=NULL;
int c;

char datei[60];
// Max Zeichen für den Dateinamen
//wenn ein argument (oder mehr) angegeben wurden
if(argc>0) {

//quelldatei ist der erste param
quelldatei=fopen(argv[1],"r");


if(quelldatei==NULL)
return -1;


if(argc>1) {
//wenn mindestens 2 Argumente angegeben wurden
zieldatei=fopen(argv[2],"w"); //zweiter param
fseek(quelldatei, 0L, SEEK_END);
long filepos = ftell(quelldatei);

while (filepos >= 0) {

fseek(quelldatei, 0L, SEEK_END);
long filepos = ftell(quelldatei);
while (filepos >= 0)
{
fseek(quelldatei, filepos, SEEK_SET);
putc(getc(quelldatei), zieldatei);
filepos -= 1;
}

} // while
} // if

if(zieldatei==NULL) {
fclose(quelldatei);
return -1;
getchar();
} // if
}

else { // if argc <= 0, keine argumente angegeben
printf("Keine Argumente angegeben \n\n");
getchar();
} // else

} // main

Boron
14-01-2002, 13:58
1) Bitte gewöhn dir für den besseren Überblick an, schön einzurücken, und zusammen gehörende Klammern untereinander zu schreiben:


if Bedingung
{
// viele Codezeilen
}

und nicht

if Bedingung {
// viele Codezeilen
} // if

Das ist ganz mieser Stil. Unglaublich schwer zu lesen, für andere und auch für dich (sagen wir mal in so ca. drei Wochen blickst du kaum noch was der Code bedeuten soll, wenn du "unschön" schreibst).

2) Wenn du schreibst "int main(int argc, char *argv[])" hat argc IMMER mindestens den Wert 1. Das heißt, du kannst deine erste If-Abfrage auf "if ( argc > 1)" ändern. Das erste Argument (also argv[0]) ist dann die ausführbare Datei selbst, incl. Pfad, und willst ja prüfen, ob ein zusätzliches Argument mit angegeben worden ist, also mindestens zwei Argumente da sind (>1).

3) Somit kannst du deine zweite if-Abfrage von "if ( argc > 1)" auf "if ( argc > 2) " ändern.

Wenn das umkopieren nicht klappt, weiß ich nicht warum.

Gruss Boron

micha
14-01-2002, 15:12
#include <stdio.h>

#include <stdlib.h>

#include <errno.h>



int main(int argc, char* argv[])

{

FILE* quelldatei=NULL;

FILE* zieldatei=NULL;

char datei[60];

long filepos;



if(argc != 3)

{

(void)fprintf( stderr, "Usage: %s SOURCE DEST\n", argv[0] );

return(-1);

}



/* quelldatei ist der erste param */

quelldatei = fopen(argv[1],"r");

if(quelldatei == NULL)

{

(void)fprintf(stderr, "Can't open source file %s: %s\n", argv[1], strerror(errno) );

return(-1);

}



zieldatei = fopen(argv[2],"w");

if(zieldatei == NULL)

{

(void)fprintf(stderr, "Can't open destination file %s: %s\n", argv[2], strerror(errno) );

return(-1);

}



(void)fseek(quelldatei, -1L, SEEK_END);

filepos = ftell(quelldatei);



while (filepos >= 0)

{

(void)fseek(quelldatei, filepos, SEEK_SET);

(void)putc(getc(quelldatei), zieldatei);

filepos--;

}



(void)fclose(quelldatei);

(void)fclose(zieldatei);



return(0);

}





Gruß micha

Debuger
14-01-2002, 15:31
THX

@micha
kannst du den Code weinwenig kommentieren damit ich weiss wo was passiert??

micha
14-01-2002, 15:59
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main(int argc, char* argv[])
{
FILE* quelldatei=NULL;
FILE* zieldatei=NULL;
char datei[60];
long filepos;


/* Wenn keine 2 Argumente übergeben wurden,
mit Fehlermeldung abbrechen */
if(argc != 3)
{
/* Benutzungshinweis auf Standardfehlerausgabe
fprintf liefert normalerweise ein Return-Code an dem wir
hier nicht interessiert sind, deshalb (void) */
(void)fprintf( stderr, "Usage: %s SOURCE DEST\n", argv[0] );
return(-1);
}

/* quelldatei öffnen und falls Fehlschlag, mit Fehlermeldung abbrechen */
quelldatei = fopen(argv[1],"r");
if(quelldatei == NULL)
{
/* strerror wandelt errno ( enthält Fehlercode von fopen im Falle eines Fehlschlags)
in eine lesbare Form um */
(void)fprintf(stderr, "Can't open source file %s: %s\n", argv[1], strerror(errno) );
return(-1);
}
/* Dasselbe für die Zieldatei */
zieldatei = fopen(argv[2],"w");
if(zieldatei == NULL)
{
(void)fprintf(stderr, "Can't open destination file %s: %s\n", argv[2], strerror(errno) );
return(-1);
}

/* Hier sollte man den Return-Code abfangen und auswerten ( EBADF und EINVAL, siehe man fseek )
Da das in Deinem Code aber nicht enthalten war, das (void) vorneweg
BEiSPIEL:
int ret;
if( (ret = fseek(quelldatei, -1L, SEEK_END)) < 0 )
{
(void)fprintf(stderr, "fseek error: %s\n", strerror(errno));
(void)fclose(quelldatei);
(void)fclose(zieldatei);
return(-1);
} */

(void)fseek(quelldatei, -1L, SEEK_END);
filepos = ftell(quelldatei);

/* Den Rest hab ich glaub schon mal dokumetentiert ;) */
while (filepos >= 0)
{
(void)fseek(quelldatei, filepos, SEEK_SET);
(void)putc(getc(quelldatei), zieldatei);
filepos--;
}

/* Beide Dateien schließen und Programm beenden.
Hier kann ebenfalls der Return-Code abgefangen werden ( siehe man fclose ) */
(void)fclose(quelldatei);
(void)fclose(zieldatei);

return(0);
}


Gruß micha