Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

1

10.04.2004, 10:09

fscanf

Hallo Leute!
Ich habe hier ein kleines Problem mit dem c++ Befehl fscanf
weiß aber dass der Fehler des nachfolgenden Codes in der Lesefunktion liegt.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
#include <iostream.h>

FILE* pfile;
char* text = 0;
char* t1 = 0;

class txt
{
    private:
    public:
        erstellen(void)
        {
            if(( pfile = fopen("blabla.txt","w+")) == 0)
            {
                printf("es funzt nicht");
                return 1;
            }
            else
            {
                printf("es wurde eine txt-Datei erstellt\n");
            }
        }
        void schreiben(char* text)
        {
            fprintf(pfile, text);
        }
        void lesen(void)
        {
            fscanf(pfile,"%d", &t1);
            cout<<t1;
        }
};

void main(void)
{
    txt textdatei;
    textdatei.erstellen();
    textdatei.schreiben("aheee");
    textdatei.lesen();
}


ich bitte um Hilfe.

Mfg :)

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

2

10.04.2004, 11:20

Zitat


char* t1 = 0;
...
fscanf(pfile,"%d", &t1);


%d steht für int, nicht für "char *".

Anonymous

unregistriert

3

10.04.2004, 11:23

und wie lauten die weiteren Befehle, (statt %d) mit denen man z.B.: Strings einlesen kann ???

Till

Alter Hase

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

4

10.04.2004, 11:25

Was willst du denn da lesen?
Einen String?
Ein char?
Ein int?

Falls es ein String sein sollte:

1. Du musst Speicher für ihn reservieren (durch array oder dynamisch)
2. Du muss die Adresse des Strings übergeben, nicht die Adresse des Zeigers auf ihn!
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

Anonymous

unregistriert

5

10.04.2004, 11:28

ich möchte eigentlich alles einlesen können
char
string
int
...

Anonymous

unregistriert

6

10.04.2004, 11:32

ich verstehe die syntax des Befehls nicht so ganz
....fscanf(File*, ???, ???)

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

7

10.04.2004, 12:11

Der Synatx von fscanf:

Quellcode

1
2
3
4
5
6
7
fscanf(FILE* datei, const char* format, arg1, arg2, argx);

FILE* datei;
int arg1, arg2;

datei = fopen("...", "r");
z.b. fscanf(datei, "%d %d", &arg1, &arg2);

Is doch eigentlich ganz einfach, der erste Parameter gibt eine Datei an, der zweite das Format das du einlesen möchtest. Z.b. hat deine Datei zwei Zahlen:

test.txt:
12 15

hintereinander. Diese sind durch ein Leerzeichen getrennt. Also musst du die so einlesen: "%d %d".

Konvertierungssequenzen für Eingaben:
%[STERN][Feldbreite][Konvertierungsangabe]

-> STERN:
Mit einem * wird die zweisung an die entsprechende Variable unterdrückt.

-> Feldbreite:
Eine ganze Zahl, die die maximale Breite des eingabefeldes angibt.

-> Konvertierungsangabe:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
d = signed int*  (dezimal)
i = signed int* (dezimal)
o = signed int* (oktal)
u = unsigned int* (dezimal)
x = signed int* (hexa)

hd = signed short int* (dezimal)
hi = signed short int* (dezimal)
ho = signed short int* (oktal)
hu = unsigned short int (oktal, bzw. dezimal)
hx = signed short int* (hexa)

ld = signed long int* (dezimal)
li = signed long int* (dezimal)
lo = signed long int* (oktal)
lu = unsigned long int* (dezimal)
lx = signed long int* (hexa)

f, e, g = float*
le, lf, lg = double*
Le, LF, Lg = long double*

c = char* (ohne '\0')
s = char* String (mit '\0')

p = void*
n = int*
hn = short int*
ln = long int*
%[nichts] = Zeichen %

das eingelesene Zeichen speicherst du dann immer auf eine Varible gleichen Types, so musst du also eine int - Variable mit %d einlesen.
(nicht den Referenzierer vergessen!!!) also &varible!!!
sonst treten Laufzeitfehler auf.

Anonymous

unregistriert

8

10.04.2004, 12:15

danke . . .
genau das wollte ich wissen :)

9

10.04.2004, 13:16

ich habe das mit einem char probiert aber es "funzt" nicht
--->>>

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <iostream.h>

FILE* pfile;
char* text;
char* t1;

class txt
{
public:
    erstellen(void)
    {
        if(( pfile = fopen("blabla.txt","w+")) == 0)
        {
            printf("es funzt nicht");
            return 1;
        }
        else
        {
            printf("es wurde eine txt-Datei erstellt\n");
        }
    }
    void schreiben(char* text)
    {
        fprintf(pfile, text);
        fclose(pfile);
    }
    void lesen(void)
    {
        pfile = fopen("blabla.txt","r");
        fscanf(pfile,"%c", &t1);
        cout<<t1<<endl;
    }
};

void main(void)
{
    txt textdatei;
    textdatei.erstellen();
    textdatei.schreiben("a");
    textdatei.lesen();
    
}

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

10

10.04.2004, 14:43

Du must noch Speicher für deinen char-Zeiger bereitstellen. Das machst du mit der Funktion malloc():

Quellcode

1
t1=(char*)malloc(sizeof(char));


Nun kannst du so ein Zeichen einlesen.

Willst du aber mehrere Zeichen (also einen String) einlesen, musst du bei fscanf() statt %c %s schreiben:

Quellcode

1
fscanf(pfile,"%s", &t1);


und dann musst du auch mehr Speicher reservieren:

Quellcode

1
t1=(char*)malloc(sizeof(char)*AnzZeichen);


wobei AnzZeichen für die Länge des Strings steht den du einlesen willst.

Ich hoffe ich konnte helfen :huhu:
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

Werbeanzeige