c++ -> daten in files ein- und auslesen (visual studio 2010)

...komplette Frage anzeigen

2 Antworten

Dein Problem liegt darin, dass du die fscanf-Funktion falsch aufrufst. Das Argument ist die Adresse einer Variable, also &struct->value1 usw.

Außerdem ist bei dir syntaxmäßig nicht günstig, dass du überhaupt "struct" als Name verwendest, mein Compiler mag das gar nicht, das ist geschützt. Nimm "text".

Dein fsacnf-Block muss so lauten:

            fscanf(fp, "%s", mytext[PFEIL nicht PUNKT!!!]wort);

            fscanf(fp, "%d", &mytext...pfeil....value1);
            fscanf(fp, "%d", &mytext...pfeil...value2);
            fscanf(fp, "%d", &mytext...pfeil....value3);

[PFEIL nicht PUNKT!!!] der Editor macht mir hier keinen Pfeil.Du brauchst den Pfeil, weil du deiner Funktion ja einen Zeiger auf die Struktur übergibst. Außerdem brauchts du die nullten Indices [0] nicht, die du überall hingeschrieben hast.

Ich habe ein wenig herumgespielt mit deinem Programm und von einem Text in den anderen kopiert, jedenfalls läuft mein Programm. Ich klebe es hier ein, dann kannst du vergleichen, wenn du noch Probleme hast. Bei mir ist der Dateipfad anders! Übrigens brauchst du bei der Angabe des Pfades immer doppelte Schrägstriche.

struct text 

{

char wort[20];

int value1;

int value2;

int value3;

};

void init(text* mytext)

{

    strcpy(mytext->wort,"X");       

    mytext->value1 = 111111;

    mytext->value2 = 222222;

    mytext->value3 = 333333;

}

void structurefunction (text* mytext)

{

    strcpy(mytext->wort,"HALLO");       

    mytext->value1 = 100;

    mytext->value2 = 200;

    mytext->value3 = 300;

} ;

void savedata (text* mytext)

{

FILE* fp;
fp = fopen ("C:\\Users\\Gast\\Textdocument.txt","w");

    if (fp!=NULL)

{

            fprintf(fp,"%s \n", mytext->wort);

            fprintf(fp,"%d \n", mytext->value1);

            fprintf(fp,"%d \n", mytext->value2);

            fprintf(fp,"%d \n", mytext->value3);

            fclose(fp);

    }

}

void loaddata (text* mytext)

{

FILE * fp; 

fp = fopen ("C:\\Users\\Gast\\Textdocument.txt","r");

if (fp!=NULL)

{ 

            fscanf(fp, "%s", mytext->wort);

            fscanf(fp, "%d", &mytext->value1);

            fscanf(fp, "%d", &mytext->value2);

            fscanf(fp, "%d", &mytext->value3);

            fclose(fp);
}

}

void lies()

{

text MYTEXT;

text DEINTEXT;

init(&MYTEXT);

init(&DEINTEXT);

structurefunction(&MYTEXT);

savedata(&MYTEXT);

loaddata(&DEINTEXT);

}

1

okay, danke erstmal. Ich werde das testen und falls irgendwas noch unklar ist meld ich mich nochmal bei euch. PS: Das ganze Programm war nur zur Demonstration gedacht, mein eigentliches Programm schaut ganz anders aus, das würd ich hier gar nicht alles rein bekommen.

1
@eVasion11

also ich hätte nur noch ne frage zu dem ' -> ' weil ich den vorher noch nie gesehen/benutzt hab. Was genau bringt denn der?

Danke schon mal im Vorraus

0
@gringo0602

Ich hab jetzt mal schnell ein neues Project gemacht, aber das haut irgendwie auch nicht so hin wie ich das will -> testprogramm.exe funktioniert nicht mehr

#include <iostream>
#include <stdio.h>
#include <conio.h>
using namespace std;

struct text {
   char word [20];
   int zahl1;
   int zahl2;
   int zahl3;
};

void init (text * mytext) {
   strcpy (mytext->word, "HALLO");
   mytext->zahl1 = 123;
   mytext->zahl2 = 456;
   mytext->zahl3 = 789;
};

void save (text * mytext) {
FILE * fp;
fp = fopen ("C:\\Users\\Name\\Documents\\Visual Studio 2010\\Textdocuments\\TEST.txt", "w");

if (fp != NULL) {
    fprintf (fp, "%s \n", mytext->word);
    fprintf (fp, "%s \n", mytext->zahl1);
    fprintf (fp, "%s \n", mytext->zahl2);
    fprintf (fp, "%s \n", mytext->zahl3);

    fclose (fp);
   }
}

void load (text * mytext) {
FILE * fp;
fp = fopen("C:\\Users\\Name\\Documents\\Visual Studio 2010\\Textdocuments\\TEST.txt", "r");

if (fp != NULL) {
    fscanf(fp, "%s", mytext->word);
    fscanf(fp, "%d", mytext->zahl1);
    fscanf(fp, "%d", mytext->zahl2);
    fscanf(fp, "%d", mytext->zahl3);

    fclose(fp);
   }
}

void run () {
   text MYTEXT;
   text YOURTEXT;
   init(&MYTEXT);
   init(&YOURTEXT);
   save(&MYTEXT);
load(&YOURTEXT);
}

int main (int argc, char*argv[]) {

run();


return 0;
}
0
@gringo0602

(1) Bei fscanf und fprintf benötigst du für die Integers die Formatierung "%d" statt "%s"

(2) Bei fscanf, wenn du die Sachen einliest, musst du die Adresse eingeben, wo du sie einlesen willst, also statt

fscanf(fp, "%d", mytext->zahl1);

lieber: fscanf(fp, "%d", &mytext->zahl1);

(3) Der Pfeiloperator -> wird benötigt, wenn du auf Members der Variable zugreifst, die du über eine Adresse übergeben hast.

Bei Deklaration text MYTEXT brauchst du den Punktoperator z.B. MYTEXT.zahl1, hast du aber die Adresse MYTEXT* adr = &MYTEXT angegeben, dann greifst du mit dem Pfeil zu: adr->zahl1. Stichwort Pointer. Da du überall Adressen übergibst, hast du das Thema vielleicht schon gehabt? Aber vergessen? ;))

0
@eVasion11

Stichwort POINTER ist gut, eine Plage ;)

Aber du hast mir wirklich sehr weiter geholfen, vielen vielen Dank

LG

1

Mal generell: Das geht nicht nur mit strings. Auch mit jedem anderen Datentypen.

Was möchtest Du wissen?