Inhalt des Kurses zurück weiter

eine Lösung zu Kurs 8

Download der Datei "cat2.c"


/*

CAT.C

Version 2

24.05.92

*/

#include <stdio.h>

#include <stdlib.h>

#define MAXIMALE_ANZAHL_ZEICHEN_PRO_ZEILE 256

/* Speicher fuer eine Zeile aus einer Datei (mit Reserve) */

char buffer[ MAXIMALE_ANZAHL_ZEICHEN_PRO_ZEILE + 1 ];

int main (

int anzahl_der_argumente,

char *feld_der_argumente[]

)

{

int index;

FILE *datei_zeiger;

int fehler;

/* Hier kommen meine neuen Variablen */

int anzahl_der_dateien = 0;

long anzahl_der_zeilen = 0;

long anzahl_der_zeichen = 0;

/* Ist etwas gegen die sofortige Initialisierung einzuwenden? */

if ( anzahl_der_argumente <= 0 ) {

printf( " Unmoeglicher Fehler, Anzahl <= 0\n" );

exit( 1 );

};

/* Schleife ueber alle Parameter ( Dateinamen ) */

for ( index = 1; index < anzahl_der_argumente; index ++ ) {

/* nun wird die Variabe durch das Oeffnen der Datei

mit 'fopen' im Textmodus zum lesen ("r") gesetzt */

datei_zeiger = fopen(

feld_der_argumente[ index ], "r" );

/* testen ob der Zeiger gueltig ist */

if ( datei_zeiger == NULL ) {
printf( "Die Datei %s wurde nicht gefunden.\n",

feld_der_argumente[ index ] );

exit( 1 ); /* Programmende */

};

/* Wenn der Dateizeiger gültig ist, dann werde ich mal

einen Apfel dazuzaehlen */

++ anzahl_der_dateien;

/* innerhalb der Bedingung dieser Schleife wird

geprueft, ob das Ende der Datei erreicht ist.

Dazu wird die Funktion 'feof' aufgerufen.

Die Schleife wird verlassen, wenn das Ende

der Datei erreicht ist. */

while ( feof( datei_zeiger) == 0 ) {

/* nun lesen wir eine Zeile ein,

ist eine Zeile laenger als angegeben,

so wird sie abgeschnitten */

fgets( buffer,

MAXIMALE_ANZAHL_ZEICHEN_PRO_ZEILE,

datei_zeiger );

/* pruefe ob ein Fehler aufgetreten ist */

if ( ferror( datei_zeiger ) != 0 ) {
printf( "Lesefehler in Datei %s.\n",

feld_der_argumente[ index ] );

exit( 1 ); /* Programmende */

};

/* ohne Zeilenvorschub ausgeben */

printf( "%s", buffer );

/* die Zeile ist auf dem Moni und so soll sie uns

in der Rechnung nicht entgehen! */

++ anzahl_der_zeilen;

anzahl_der_zeichen += strlen(buffer);

};

/* fertig, Datei schliessen */

fehler = fclose( datei_zeiger );

if ( fehler != 0 ) {
printf( "Die Datei %s wurde nicht geschlossen.\n",

feld_der_argumente[ index ] );

exit( 1 ); /* Programmende */

}

/* naechsten Parameter berabeiten */

};

/* wenn nichts schief gelaufen ist sollte der Programm-Counter

jetzt irgendwo hier vorbeikommen */

printf( "\nIch habe jetzt %d Dateien\n", anzahl_der_dateien );

printf( "mit insgesamt %ld Zeilen und\n", anzahl_der_zeilen );

printf( "summa sumarum %ld Zeichen zum Bildschirm geschickt.\n",

anzahl_der_zeichen );

/* endlich fertig */

return 0;

}

/* ENDE DER DATEI */


Uebrigens, die letzte Zeile einer Datei wird nochmal ausgegeben. Woran liegt das?

Antwort:

Das Ende der Schleife wird zu spät erkannt. Die Funktion 'fgets' bricht wegen "END OF FILE" ab, sie liefert den NULL-Pointer zurück. Die Funktion 'ferror' stellt keinen Fehler fest, un so wird die letzte Zeile im noch unverändertem Buffer erneut ausgegeben.