C: Zeilenweise aus einer Datei einlesen

FoH

Grünschnabel
Okay Problem gelöst!

und zwar hat '\n' den Dezimalwert 10. Da aber meine Variable ein Platz von 20 (char bank[20]={};) hat, musste ich '\n\n' nutzen!

fscanf(text,"%d;%[^'\n\n']",&t,&bank);
printf("%d - %s",t,bank);

output: 50090607 - apoBank Frankfurt Main


Vielen Dank! Es sind immer so Kleinigkeiten, die bringen einen um den Verstand :)
 

FoH

Grünschnabel
Das problem ist nun doch leider nicht gelöst. Denn zwar ist die erste Zeile:

50090607 - apoBank Frankfurt Main

Aber es werden alle restlichen Charakter ausgegeben. Also wenn ich ein mal die fscanf Funktion aufrufe, sieht das ganze so aus:

50090607 - apoBank Frankfurt Main
51220800;Banco do Brasil Frankfurt
10020500;Bank f�r Sozialwirtschaft
66090800;BBBank Karlsruhe
10000000;BBk Berlin
50000000;BBk Filiale Frankfurt Main
......


Die Warnung ist immer noch vorhanden: format %[^'

Ich weiß nicht mehr weiter...
 

cwriter

Erfahrenes Mitglied
und zwar hat '\n' den Dezimalwert 10. Da aber meine Variable ein Platz von 20 (char bank[20]={};) hat, musste ich '\n\n' nutzen!
In welchem Universum macht das Sinn?
Die Warnung ist immer noch vorhanden: format %[^'
Ja, weil du irgendwas komisches machst. Warum ein Apostroph im String? Das macht keinen Sinn.
Aber es werden alle restlichen Charakter ausgegeben. Also wenn ich ein mal die fscanf Funktion aufrufe, sieht das ganze so aus:
Weil du nicht einfach Code nehmen und umbauen kannst, ohne ihn vorher verstanden zu haben. Das %[^\n] heisst: Lies alles, bis das erste Zeichen auftritt, das nicht (^) newline (\n) ist. Du hast jetzt sowas wie "Lies, bis das erste Zeichen auftritt, das nicht ' ist" und ein bisschen Gemüse dazu.

Gruss
cwriter
 

FoH

Grünschnabel
Leider kann ich aber es aber immer noch nicht ausgeben, weil ich, fscanf nicht verstehe, da ich leider auch ein Anfänger bin, was C angeht, komme ich hier einfach nicht weiter. Wie müsste deiner Meinung nach denn die Zeile aussehen? Ich habe schon so viele Varianten ausprobiert und es funktioniert nicht, wie ich es möchte. Das problem ist ja, dass ich aus jeder Zeile die Zahl und dann hinter dem ";" den Namen der Bank speichern möchte.

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

Wäre es so richtig? Und wenn ich das aufrufen sollte (falls alles richtig ist), kann ich dann Zeile für Zeile ausgeben? Denn ich muss vorher die Variablen t und bank abfangen, sobald ich eine bestimmte blz gefunden habe
 
Zuletzt bearbeitet:

cwriter

Erfahrenes Mitglied
fscanf(text,"%d;%[^\n]",&blz,&bank);
Hast du es ausprobiert?

Wenn ich mich nicht irre, musst du das Newline noch mitlesen:
fscanf(text,"%d;%[^\n]\n",&blz,&bank);

Wäre es so richtig? Und wenn ich das aufrufen sollte (falls alles richtig ist), kann ich dann Zeile für Zeile ausgeben? Denn ich muss vorher die Variablen t und bank abfangen, sobald ich eine bestimmte blz gefunden habe
Aber was ist denn eine Zeile und wie funktioniert fscanf()?
Weisst du, wie scanf() funktioniert? Grundlagen der Ein- und Ausgabe?

Mir scheint, als würdest du ein Orakel anrufen "Was macht denn dies?". Das Problem dabei ist, dass es mir sagt, dass du die Grundlagen noch nicht kannst und Code in magischen Snipplets verstehst, du den Code also zusammenkopierst, statt ihn selbst zu schreiben. Und das geht langfristig nicht auf.

Um die Frage zu beantworten: Ja, mit jedem Aufruf von dieser fscanf-Zeile wird eine Zeile der Datei gelesen, sofern sie im richtigen Format ist (<Zahl>;<String>).

Gruss
cwriter
 

FoH

Grünschnabel
warning: format ‘%[^ weiterhin, wenn ich fscanf(text,"%d;%[^\n]\n",&blz,&bank); nutze.

Und wie gesagt, ich bin Anfänger in der Programmiersprache C, ich habe erst vor 5 Wochen damit angefangen mich auseinander zu setzen. Also ja es ist quasi wie "Das Orakel anrufen". Hilft mir nur nich weiter, da ich seit 2 Tagen versuche eine Zeile zu lesen aus einer Textdatei und es funktioniert nicht ;-)

Morgen werde ich mir Hilfe vom Tutor in der Beratung holen.
 

cwriter

Erfahrenes Mitglied
C:
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
        char tmp[256];
        while(fscanf(stdin, "\n%[^\n]", tmp) && !feof(stdin))
                printf("Read \"%s\"\n", tmp);
        return 0;
}
gcc -Wall main.c => keine Warnung (gcc 7.2.0)

Ah, jetzt sehe ich es: Du hast ein &bank, aber es sollte nur bank sein, wenn es ein char-Array ist. Hat aber an sich nichts mit dem Format zu tun und eine volle Warnung hätte das auch offenbart...


cwriter
 
Zuletzt bearbeitet:

FoH

Grünschnabel
FILE *text = fopen("/home/ip/Schreibtisch/BLZ.txt", "r");

char tmp[256];
while(fscanf(text, "\n%[^\n]", tmp) && !feof(text)) printf("Read \"%s\"\n", tmp);

Keine Warnung oder Error. Aber es wird nichts ausgegeben beim Ausführen. Das sollte doch so funktionieren?
 

cwriter

Erfahrenes Mitglied
Es sei denn, das stdin hat nichts mit der Textdatei zu tun bzw. man kann es so nicht nutzen.
fscanf(stdin, ...) ist dasselbe wie scanf(...).
stdin ist die Standardeingabe, was Datei-artig ist. (Die gängigen Dateioperationen funktionieren auch darauf, sofern es Lese-operationen und kein seeking/writing sind).

Keine Warnung oder Error. Aber es wird nichts ausgegeben beim Ausführen.
Ist die Datei vielleicht leer / inexistent?

Nimm das Originalprogramm (exakt den Code wie oben) und rufe es in einem Terminal so auf:
Code:
./a.out < /home/ip/Schreibtisch/BLZ.txt

Auf meiner Maschine (Debian Sid):

Code:
usr@m:~/Dokumente/test$ gcc main.c
usr@m:~/Dokumente/test$ cat test.txt
test line 1
test line 2
test line 3
Yippie
usr@m:~/Dokumente/test$ ./a.out < test.txt
Read "test line 1"
Read "test line 2"
Read "test line 3"
Read "Yippie"
usr@m:~/Dokumente/test$

Gruss
cwriter
 

FoH

Grünschnabel
20:42:29 **** Build of configuration Debug for project test ****
make all
Building file: ../src/test.c
Invoking: GCC C Compiler
gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/test.d" -MT"src/test.d" -o "src/test.o" "../src/test.c"
Finished building: ../src/test.c
Building target: test
Invoking: GCC C Linker
gcc -o "test" ./src/test.o
Finished building target: test

20:42:29 Build Finished (took 149ms)

test
Read "test"
HI
Read "HI"
32321321;testing
Read "32321321;testing"