fscanf - fil I/O

C_Boy

Mitglied
Hallo zusammen,

ich sag erzählt euch mal was. Möchte wissen ob das so richtig ist, wenn nicht bitte erklären.

In Text-Datei steht:
2 3 2
6 6 7

fscanf(file1,"%d",%zahl) ---> liest 2 dann leerzeichen dann 3 usw. zeichenweise halt^^.

fscanf(file1,"%d %d %d"&a,&b,&c) ---> es speichert einfach 2 in a 3 in b und 2 in c.

In Text-Datei steht:
255 565
165 10

Wenn mann hier jetzt also Zahlgruppen speichern will dann muss man Strings-Array verwenden? So ungefähr stimmts?

char temp[100]

fscanf(file1,"%s",&temp)---> jetzt liester es 2 dann 5 dann 5 dann ist ein leer ---> es speichert 255 in temp dann geht weiter liest 5 6 dann 5 sieht \n speichert wieder 565 in temp...


fscanf(file1,"%s %s"&temp, &temp1) ---> jetzt dadurch das jetzt 2 %s hier sind, liest es wie oben nur speichert es halt 255 in temp und 565 in temp1.

Dürfte eigentlich im Großen und Ganzem stimmen oder?

Grüße
 
In Text-Datei steht:
2 3 2
6 6 7

fscanf(file1,"%d",&zahl) ---> liest 2 dann leerzeichen dann 3 usw. zeichenweise halt^^.
Zahl enthält dann 2. Das wars.

fscanf(file1,"%d %d %d"&a,&b,&c) ---> es speichert einfach 2 in a 3 in b und 2 in c.
Ja

In Text-Datei steht:
255 565
165 10

Wenn mann hier jetzt also Zahlgruppen speichern will dann muss man Strings-Array verwenden? So ungefähr stimmts?

char temp[100]
Das ist ein Char Array (steht ja schließlich auch char und nicht String vor)
Du musst dafür allerdings weder Strings noch Chararrays verwenden: Das hier sollte auch funktionieren:
C++:
int i;
fscanf(file, "%3d", &i);

fscanf(file1,"%s",&temp)---> jetzt liester es 2 dann 5 dann 5 dann ist ein leer ---> es speichert 255 in temp dann geht weiter liest 5 6 dann 5 sieht \n speichert wieder 565 in temp...

Mal davon abgesehen, dass ein Programm nicht "sehen" kann, liest es nur die ersten 3 Zeichen ein (also bis zum Leerzeichen). temp enthält dann 255.


fscanf(file1,"%s %s"&temp, &temp1) ---> jetzt dadurch das jetzt 2 %s hier sind, liest es wie oben nur speichert es halt 255 in temp und 565 in temp1.
Richtig. Der Rest von der Datei wird allerdings nirgendwo gespeichert.


Anmerkung:
Wieso probierst du das eigentlich nicht einfach aus? Wirst ja sehen ob es stimmt oder nicht :D

Und: Google ich nach "fscanf" erhalte ich gleich als erstes Suchergebnis einen Link zur C++ Referenz in dem die Funktion genaustens beschrieben ist.
 
Ok, dann fass ich mal ein bisschen zusammen mit ein paar Fragen :D:

Ich hab das ganze jetzt mit Einzelschritt in Visual C ausgetestet...

Zahlen(int, etc.):

Im Textdokument steht:
56 553
555 65

fscanf(file1,"%d",&a)---> fasst alle zahlen von 0-9 zusammen bis keine zahlen mehr kommen... ---> speichert 56 in a, weil ja nach 6 ein Leerzeichen kommt.

Mit %3d wie du sagtest macht es das gleiche.
Hingegen mit %1d liest es nun zeichenweise, es speichert 5 in a dann 6 in a, leerzeichen wird nicht beachtet ---> speichert 5 in usw.

fscanf(file1,"%d %d",&a,&b) --> hier speichert es 56 in a und 553 in b...
Wenn hier %1d steht dann: a=5 und b=6 leer wird wieder nicht berücksichtigt a=5, b=5 ---> dann a=3 und b=1 usw.

Jetzt zu den chars :):

Im Textdokument steht(das ß wird dann zum schwarzen Viereck, aber egal Rechtschreibung geht vor :D):
hallo ich
heiße tom

char tmp;

fscanf(file1,"%c",tmp); ---> jetzt wird wirklich alles zeichenweise gelesen. Zuerst das h dann a, l, l, o, leer, i,c,h \n(\n wird als Viereck gekennzeichnet) es geht in die nächste Zeile usw.
%2c, %3c etc. funktioniert bei mich icht ---> es kommt ein
"Stack arround variable tmp wos corrupted" Kann man das auch irgendwie lösen? Oder geht das von Haus aus nicht?

char tmp; char tmp1;

fsanf(file1,"%c %c",tmp,tmp1); ---> wie gesagt liest zeichenweise. tmp=h, tmp1=a usw. immer 2 schritte sozusagen. leerzeichen und \n werden berücksichtigt.

char tmp[100];
fscanf(file1,"%s",&tmp); ---> Es wird gelesen bis ein leerzeichen, tabulator, oder \n kommt.
Also wird hallo+leerzeichen gelesen udn in tmp[] gespeichert. tmp[0]=h usw.
tmp[5]=0
Jetzt wird weiter gelesen:
Dann wird überschrieben: tmp[0]=i usw. tmp[3] = 0(wegen \n)
Aber bei tmp[4](o) und tmp[5](leerzichen) ist noch was gespeichert von dem "hallo."
Wird das nicht mit fflush(stdin) gelöscht. Bei mir funktioniert es nicht. Wie macht man das?

Oder z.B. wenn ich den Text jetzt ausgeben will(printf("%s",tmp)), dann wird es so hingeschrieben: halloichheißetom
Kann man das net so ausgeben wie in der Text-Datei geschrieben bzw. mit Leerzeichen?

fscanf(file1,"%s %s",&tmp,%tmp1); ---> hier wird jetzt das hallo inklusive das Leer in tmp gespeichert und das ich inklusive \n in tmp1[] gespeichert. Das gleiche mit "heiße tom".

Wenn ich das jetzt ausgebe(printf("%s %s",tmp,tmp1)) dann schreibt es hin:
hallo ichheiße tom
Die gleiche Frage wie oben - Warum?


So...., aber was ist nun am besten zu verwenden?

Für Zahlen ists ja klar ---> int, float, double etc.

Aber char-arrays, oder char. Ich würde sagen in den meisten Fällen ist eigentlich char besser.

Ich weiß, viel Stoff zum Lesen.

Aber ich bedanke mich jetzt schon mit großem Herzen bei euch :D. Danke!

MfG C_boy
 
Zuletzt bearbeitet:
Hi

fscanf(file1,"%c",tmp);
Aua.
Da tmp ein einzelner char ist, muss es heißen
fscanf(file1,"%c",&tmp);
Das es ein paar Mal funktioniert hat, war wohl mehr oder weniger Zufall.
Das schwarze Viereck statt dem Zeilenwechsel war das erste Problem, das dadruch verursacht wurde.
Der Absturz war dann das zweite...
Das mit dem & gilt auch für alle anderen scanf mit Einzelvariablen in deinem Beitrag.

Dann...statt %2c und %3c mach besser %c in einer Schleife.
%2d geht, weil eine Zahl aus mehreren Ziffern bestehen kann.
Ein Buchstabe bleibt aber immer nur einer, der besteht nicht aus 3 Buchstaben.

Dann hier:
fscanf(file1,"%s",&tmp);
ist tmp keine einzelvariable mehr.
Weg mit dem &.

Zu fflush(stdin): Das ist böse. :hiergibtskeinenbösensmiley: Weg damit.
Was hat eigentlich jeder mit diesem fflush?
Das darf gar nicht so funktionieren, wie alle sich das vorstellen, und trotzdem bringen sich die Leute das gegenseitig bei udn preisen es als Lösung für alle scanf-Probleme an...

Und auch, wenns es nicht böse wäre, ändert es nichts an char-Arrays. Und auch nicht an fscanf. Nur an scanf.
Das bei dir nach der 0 noch Buchstaben sind, ist ganz normal.
Deswegen gibts ja die Null, die bedeutet: Hier ist Schluss.

Zu deinen leerzeichenlosen Ausgaben:
Mit fgets kannst du eine ganze Zeile mit Leerzeichen und allem Drum und dran in ein char-Array einlesen.
Warum wurschtelst du mit fscanf herum, wenns mit einem einzigen Befehl auch geht?

Was ist besser, char vs char-Array: Was ist denn das für eine Frage?
Ein char ist ein Buchstabe (ja, immer nur einer), ein Array daraus hat viele Buchstaben.
Die Frage ist: Was brauchst du denn?
 
Zuletzt bearbeitet:
Zurück