C: Zeilenweise aus einer Datei einlesen

UpTown

Grünschnabel
Hallo liebe Community,

ich habe ein Problem bei meinem Programm.
Undzwar soll ich zu einer eingegebenen Bankleitzahl, die Bankfiliale aus einer Textdatei auslesen.
Dazu muss ich die Datei zeilenweise auslesen und die ersten 8 Zeichen der Zeile mit dem String Bankleitzahl
vergleich.
Stimmen diese überein, so soll der Rest der Zeile ausgegeben werden.
Außerdem soll die Zeile in der die BLZ übereinstimmt mitgezählt und ausgegeben werden.
Findet keine Übereinstimmung statt, so soll eine Fehlermeldung ausgegeben werden.

Bsp. aus der Datei:
50090607;apoBank Frankfurt Main
51220800;Banco do Brasil Frankfurt

So hatte ich mir das vorgestellt:

while(!feof(datei)) {
fgets(datei,49,Filiale);
if(strncpy(Filiale,Bankleitzahl,8)) {
printf("Filialenname: %s\nZeile %d",Filiale,i);
break;
}
i++;
}
Die Ausgabe findet nie statt, obwohl ich eine gültige BLZ eingebe, woran kann es liegen?
 

cwriter

Erfahrenes Mitglied
Hi

Zeilenweises Auslesen macht man normalerweise mit der Überprüfung fgets() != NULL (EOF ist problematisch).
Zu deinem Code: strncpy kopiert. Du meinst wohl strncmp? Dann sollte auch dein if entsprechend funktionieren.
Ansonsten brauchen wir mehr Code.

Gruss
cwriter
 

UpTown

Grünschnabel
So hier ist der relevante Teil des Quellcodes:
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
   FILE *datei;
   int posBLZ = 0;
   int posKontoNr = 0;
   int laengePuffer = 0;
   int n = 0;
   int i = 0;
   char PP[3] = "00";
   char Bankleitzahl[9] = {'\0'};
   char puffer[11] = {'\0'};
   char Filiale[50] = {'\0'};
   char Kontonummer[11] = {'\0'};


   datei = fopen("BLZ.txt","r");   // Datei wird geöffnet (BLZ.txt)

   if(NULL == datei) {
       printf("Datei BLZ:txt konnte nicht geöffnet werden!\n");
       return EXIT_FAILURE;       // Programm wird beendet, wenn Datei nicht geöffent werden konnte
   }

   /* Inhalt der Textdatei zeilenweise ausgeben*/

   printf("Liste der Bankfilialen:\n");
   while(!feof(datei)) {
       fgets(Filiale,50,datei);
       printf("%s",Filiale);
   }
   printf("\n");

   do {
       printf("8-stellige Bankleitzahl eingeben:\n");
       scanf("%s",Bankleitzahl);
       posBLZ = strspn(Bankleitzahl,"0123456789");       // Gibt ggf. die Position aus, die keine Ziffer enthält

       printf("10-stellige Kontonummer eingeben:\n");
       scanf("%s,",puffer);
       posKontoNr = strspn(puffer,"0123456789");        // Gibt ggf. die Position aus, die keine Ziffer enthält
       laengePuffer = strlen(puffer);
       if(strlen(Bankleitzahl) < 8) {
           printf("Fehlerhafte Eingabe: Bankleitzahl muss exakt 8 Ziffer haben!\n");
       }
       if((posBLZ >= 0) && (posBLZ < 8)) {
           printf("Fehlerhafte Eingabe bei der BLZ: Keine Ziffer an der Stelle %d eingegeben!\n",++posBLZ);
       }
       if((posKontoNr >= 0) && (posKontoNr < laengePuffer)) {
           printf("%c",Kontonummer[posKontoNr]);
           printf("Fehlerhafte Eingabe bei der Kontonr.: Keine Ziffer an der Stelle %d eingegeben!\n",++posKontoNr);
       }
   }while((strlen(Bankleitzahl) < 8) || ((posBLZ >= 0) && (posBLZ < 8)) || ((posKontoNr >= 0) && (posKontoNr < laengePuffer)));

   rewind(datei);

   n = 10 - laengePuffer;                       // Anzahl der Stellen, die noch benötigt werden
   strncpy(Kontonummer,"0000000000",n);   // Kontonummer wird ggf. vorne mit 0 aufgefüllt
   strncat(Kontonummer,puffer,laengePuffer);


   while(fgets(Filiale,50,datei) != NULL) {
       printf("BLZ: %s\n",Bankleitzahl);
       if(strncmp(Filiale,Bankleitzahl,8)) {
           printf("Filialenname: %s\nZeile %d\n",Filiale,i);
           break;
       }
       i++;
   }
Egal was für eine BLZ ich eingebe, spuckt mir das Programm nur die 1e Zeile + einen Teil der 2ten aus:

Filialenname: 50090607;apoBank Frankfurt Main
51220800;Banco d
Zeile 0
Habt ihr ne Ahnung woran's liegt?
 
Zuletzt bearbeitet von einem Moderator:

cwriter

Erfahrenes Mitglied
Hi.

Du solltest strncmp auf 0 prüfen (0=Keine Differenz der Strings. Momentan machst du genau das Umgekehrte).
Im Übrigen solltest du i bei Gelegenheit zurücksetzen. Bei diesem Code ist es nicht nachvollziehbar, dass mehr als eine Zeile ausgegeben wird. Sicher, dass das der aktuelle Code ist?

cwriter
 

UpTown

Grünschnabel
Ja, in dem Code hab ich jetzt lediglich die If-Bedingung geändert. Er läuft die ganze Datei ab, kann aber keine Übereinstimmung finden, obwohl ich eine gültige Eingabe mache.

Kann es daran liegen, dass ich im Argument von fgets die Zahl 49 reingeschrieben habe und er deswegen 49 Zeichen einliest?
 

cwriter

Erfahrenes Mitglied
C:
printf("BLZ: %s\n",Bankleitzahl);
printf("%s\n", Filiale); //Füge das nach der obigen Zeile ein
Was ist die Ausgabe?
Kann es daran liegen, dass ich im Argument von fgets die Zahl 49 reingeschrieben habe und er deswegen 49 Zeichen einliest?
Was sagt die Dokumentation?
Nein, daran liegt es nicht. Diese Zahl bezeichnet nur die maximale Zahl an Zeichen, die gelesen werden dürfen (sonst bis zum ersten \n oder EOF.

/EDIT: Hehe... Deine Zeilen sind länger als 50 Zeichen... Also hast du Recht: Du liest nicht wirklich zeilenweise. Eine einfache Lösung ist die Vergrösserung des Buffers (und der Lesgrösse) auf eine sinnvolle Zahl (256-1024).

Gruss
cwriter
 
Zuletzt bearbeitet:

UpTown

Grünschnabel
Es lag an der Datei, das Programm konnte das Zeilenende nicht intepretieren.
Das Programm läuft jetzt.
Trotzdem vielen Dank für deine Hilfe :D
 

FoH

Grünschnabel
Ich hätte gerne die Lösung gesehen.

Weiß jemand wie man Zeilenweise einlesen kann, ohne dass man mit fgets oder mit fscanf in die nächste Zeile rutscht? Zum Beispiel wie bei der Text Datei die oben beschrieben wurde.
 

cwriter

Erfahrenes Mitglied
Weiß jemand wie man Zeilenweise einlesen kann, ohne dass man mit fgets oder mit fscanf in die nächste Zeile rutscht?
Was meinst du damit? Und vor allem: Weshalb würdest du das wollen?
Mit "%[^\n]" als Formatspezifizierer in fscanf() kannst du alles aus der Zeile ohne das Newline lesen. Aber dann hast du ja ein \n übrig, sodass der nächste Aufruf nichts einliest (nur das \n überspringt) und dann der übernächste Aufruf wieder einen Teil der Zeile liest. In der Regel arrangiert man sich mit dem angehängten '\n'.

Gruss
cwriter
 

FoH

Grünschnabel
Hi vielen Dank für die schnelle Antwort. Allerdings weiß ich immer noch nicht wie das aussehen soll. Ich habe hier was versucht, aber es gibt Probleme.

fscanf(text,"%d;%[^\n]",&blz,&bank);

Mir wird eine Warnung gegeben worin steht "format '%[^" bzgl. der Variable bank.

Was mache ich falsch?