Infobeleg: Daten aus Textdatei einlesen



  • Hallo Leute, dies ist mein 1. Beitrag:
    Ich muss fürs Studium nen Infobeleg anfertigen, welcher Serienbriefe erstellt.
    Dazu soll ich auch aus einer Datei die Kundendaten einlesen und dann in einen Einheitsbrief einfügen.
    Bei mir haperts erst mal am einfügen der Kundendaten in eine Struktur.

    Hoffe, ihr könnt mir da weiterhelfen. 😕

    Vielen Dank

    #include "conio.h"
    #include "stdio.h"
    #include "string.h"
    
    #define G 5
    
    struct Kunde {char Vorname[15];char Nachname[20];int Geschlecht;char Adr_Str[30];char Adr_Ort[20];char Betreff[17];};
    struct Kunde kunde;
    
    void main()
    {
    
    	FILE *Info,*Brief;
    	int k;
    	char *kunde;
    	char puffer[120],Datei;
    
    Info= fopen("c:\\kunde.txt","r");
    
    //Get struct from Kunde.txt
    
    while(Info!='EOF')
    	{
    	fgets(puffer,120,Info);
    	fscanf(Info,"%s%s%d%s%s%s",
    						 kunde.Vorname,
    						 kunde.Nachname,
    						 kunde.Geschlecht,
    						 kunde.Adr_Str,
    						 kunde.Adr_Ort,
    						 kunde.Betreff);
    
    	}}
    


  • PlattitüdenAbonennt schrieb:

    ...
    	FILE *Info,*Brief;
    	int k;
    	char *kunde;               // <--- lösche diese zeile
    	char puffer[120],Datei;
    ...
    


  • danke, hat paar fehler beseitigt, aber was ist mit dem Fehler im Zusammenhang mit der While-Anweisung?

    error C2446: '!=' : Keine Konvertierung von 'const int' in 'struct _iobuf *'



  • PlattitüdenAbonennt schrieb:

    danke, hat paar fehler beseitigt, aber was ist mit dem Fehler im Zusammenhang mit der While-Anweisung?

    error C2446: '!=' : Keine Konvertierung von 'const int' in 'struct _iobuf *'

    das geht so nicht. wolltest sicher sowas:

    while (0 == feof(Info))
    {
       // hier deine file i/o
    }
    


  • Hallo

    deinen Ausdruck kenne ich leider noch nicht, hab erst seit 2 Semestern C.
    Ich meinte, dass abgebrochen wird, sobald in der Datei die Zeichen EOF auftauchen.



  • PlattitüdenAbonennt schrieb:

    deinen Ausdruck kenne ich leider noch nicht, hab erst seit 2 Semestern C.

    2 semester? das sind doch schon ein paar monate 🙄
    guckst du: http://www.cplusplus.com/ref/cstdio/feof.html



  • aha
    naja im 1. Semester haben wir fast nur Struktogramme gezeichnet. 😞

    Nächstes Problem: ich muss schauen, wo im Einheitsbrief die Platzhalter auftauchen und diese dann mit den Kundendaten ersetzen.

    ist da fputc() ein geeignetes MIttel?
    Hier der Brief:

    An $$Anrede_1$$ $$Vorname$$ $$Name$$

    AdrStrAdr_Str

    AdrOrtAdr_Ort

    Betreff: $$Betreff$$

    Sehr $$Anrede_2$$ $$Anrede_1$$ $$Name$$,

    Es freut mich, ihnen mitteilen zu können, dass ihr $$Betreff$$ nun abholbereit bei uns lagert.

    MfG

    char puffer[500],Datei,Text
    
    //Brief einlesen
    
    Brief = fopen("c:\\Brief.txt","r" );
    
    Text=fgets(puffer,500,Brief);
    
    //Vergleichen der Platzhalter; Ersetzen dieser mit den Structdaten
    
    if(strcmp(Text,'$$Anrede_1$$')==0)
    {};
    
    if(strcmp(Text,'$$Anrede_2$$')==0)
    {};
    


  • naja, vom prinzip her kannstes so machen
    1. template datei (datei1) öffnen zum lesen (die mit diesen $$ drin)
    2. output datei (datei2) anlegen
    3. alles aus datei1 nach datei2 kopieren bis $$ gefunden wird
    4. ist datei1 am ende angekommen datei2 und datei1 schliessen und *ende*
    5. alles aus datei1 in ein char array kopieren (variablenname) bis $$ gefunden wird
    6. anhand des variablennamens den inhalt der variablen ermitteln
    7. variable in datei2 speichern
    8. weiter bei schritt 3

    mit fputc, fgetc kann man's machen, vielleicht als zustandsautomat. hast jedenfalls gut zu tun damit 😉



  • Salut Helfer,

    Ich mach die Sachen erst mal Nacheinander.
    Das Ding mit dem EOF hab ich so gelöst, sieht man im Code.

    Aber nun kommt noch eine bekackte Fehlermeldung:

    error C2664: 'fscanf' : Konvertierung des Parameters 1 von 'char *' in 'struct _iobuf *' nicht moeglich
    Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat

    #include "conio.h"
    #include "stdio.h"
    #include "string.h"
    
    #define EOF '\n'
    
    struct Kunde {char Vorname[15];char Nachname[20];int Geschlecht;char Adr_Str[30];char Adr_Ort[20];char Betreff[17];};
    struct Kunde kunde;
    
    void main()
    {
    
    	FILE *Info,*Brief;
    	int k,Nummer =00001;
    	char puffer[500],Datei,Text,Resultat;
    
    Info= fopen("c:\\kunde.txt","r");
    Datei= *fgets(puffer,120,Info);
    
    //Get struct from Kunde.txt
    
    while(Datei!=EOF)
    	{
    	//fgets(puffer,120,Info);
    	fscanf(Datei,"%s%s%d%s%s%s",
    						 &kunde.Vorname,
    						 &kunde.Nachname,
    						 &kunde.Geschlecht,
    						 &kunde.Adr_Str,
    						 &kunde.Adr_Ort,
    						 &kunde.Betreff);
    
    	}
    printf("DAtei enthält: %s%s",kunde.Vorname,kunde.Nachname);
    


  • fscanf will einen FILE*, keinen char*

    c referenz:
    http://www.dinkumware.com/manuals/reader.aspx?b=c/&h=index.html



  • Hallo

    Leider erschließt sich mir der Zusammenhang nicht, denn wenn ich es so:

    FILE *Info,*Brief,*Datei;
    int k,Nummer =00001;
    char puffer[500],Text,Resultat;
    

    mache, kommen diese Fehlermeldungen:

    error C2440: '=' : 'char *' kann nicht in 'struct _iobuf *' konvertiert werden
    Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat

    error C2446: '!=' : Keine Konvertierung von 'int' in 'struct _iobuf *'
    Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat

    error C2040: '!=' : 'struct _iobuf *' unterscheidet sich von 'int' in bezug auf die Anzahl vorgenommener Dereferenzierungen



  • hoerst du zu?

    fscanf will keinen char*, sondern einen FILE*.
    Datei ist ein char*/char[], also falsch.



  • Ey mal nicht so derbe!!
    Bin noch Anfänger, wie du vielleicht gelesen hast.

    ich hab doch jetzt FILE *Datei, was gibt es denn da dran auszusetzen?



  • deine fehlermeldungen haben aber immernoch keinen bezug zu irgendwelchem code.
    ausserdem sagen mir deine fehlermeldungen, dass du den fehler nicht behoben hast oder die meldungen noch alt sind.

    edit: poste einen ganzen code. gib mir was zum arbeiten, wenn du schon hilfe willst. ich kann ja wohl schlecht aus ner glaskugel lesen.



  • Code steht zwar schon auf der 1. Seite, aber hier nochmal:

    #include "conio.h"
    #include "stdio.h"
    #include "string.h"
    
    #define g 500
    
    struct Kunde {char Vorname[15];char Nachname[20];int Geschlecht;char Adr_Str[30];char Adr_Ort[20];char Betreff[17];};
    struct Kunde kunde;
    
    void main()
    {
    
    	FILE *Info,*Brief,*Datei;
    	int k,Nummer =00001;
    	char puffer[g],Text[g],Resultat[g];
    
    Info= fopen("c:\\kunde.txt","r");
    Datei= fgets(puffer,120,Info);
    
    //Get struct from Kunde.txt
    
    while(Datei!='\n')
    	{
    	//fgets(puffer,120,Info);
    	fscanf(Datei,"%s%s%d%s%s%s",
    						 &kunde.Vorname,
    						 &kunde.Nachname,
    						 &kunde.Geschlecht,
    						 &kunde.Adr_Str,
    						 &kunde.Adr_Ort,
    						 &kunde.Betreff);
    
    	}
    printf("DAtei enthält: %s%s",kunde.Vorname,kunde.Nachname);
    


  • PlattitüdenAbonennt schrieb:

    Code steht zwar schon auf der 1. Seite, aber hier nochmal:

    ...edit...snip...
    
    Datei= fgets(puffer,120,Info);
    

    Was soll denn hier passieren?

    char puffer[g]
    

    Sollte auch nicht gehen

    char* puffer = new char[g]
    


  • Gast25250 schrieb:

    char puffer[g]
    

    Sollte auch nicht gehen

    Warum nicht?

    Gast25250 schrieb:

    char* puffer = new char[g]
    

    In C? 🙄



  • Datei= fgets(puffer,120,Info);

    Na hier sollen eingentlich Zeile für Zeile später einmal die einzelnen Kundendaten in ein Strukturfeld geladen werden



  • Datei ist ein dateihandle, also nur ziel des rueckgabewertes von fopen.
    fgets gibt keine dateihandles zurueck.

    das moechtest du gerne lesen:
    http://www.pronix.de/pronix-4.html


Anmelden zum Antworten