Textdokumente einlesen und filtern



  • hi, kann man irgendwie eine namensliste so sortieren, das z.B. nur der name, adresse und die telefonnummer sortiert wird.

    aussehen tut die liste in etwa so:
    vorname
    nachname
    adresse
    telefon
    handy

    mein programm sieht so aus:

    #include < stdio.h >
    #include < ctype.h >
    #include < conio.h >
    #include < string.h> 
    
    void main ()
    {
    
    FILE *f;
    FILE *datei;
    
    	char buf[100] ;
    
    	f = fopen("1AHE03.txt", "r");
    	datei = fopen("2AHE04.txt", "w");
    
    	while(!feof(f))
    	{
    
    		fscanf(f, "%s", &buf);
    
    		fprintf(datei, "%s\n\n", buf);
    
    		printf("-> %s\n\n", buf);
    	}
    
    fclose(f);
    fclose(datei);
    
    }
    

    danke im voraus



  • irr ich mich, oder ist das c? 😉

    ansonsten weis ich nicht, was genau du wirklich machen willst 😕



  • Also ich kann dir nur insofern helfen, indem wir auch schon ma ein telefonbuch in der Schule Programmieren sollten, mit der man nach Namen, Vornamen oder Telefonnummer sotieren sollte! Dieses Aufgabe wurde dymnamisch gelöst!
    Hier ist die Source:

    #include <stdio.h>
    #include <stdlib.h>
    #include <dos.h>
    #include <conio.h>
    #include <string.h>
    #include <iostream.h>
    #include <fstream.h>

    #define MAX 30

    struct Satz
    {
    char name[MAX];
    char vorname[MAX];
    char tel[MAX];
    };

    void read_satz (struct Satz *pa);
    void view_satz (struct Satz *pa);
    void sort_satz (struct Satz *pa,struct Satz *pb);
    void change_satz (struct Satz *pa,struct Satz *pb);
    long int compare_satz (struct Satz *pa, struct Satz *pb, int status);
    void save_satz (struct Satz *ps);

    void main(void)
    {
    int z,save,menu;
    struct Satz *pa,*pb,*pc,*ps;
    char pfad[50];

    printf("Telefonbuch (0.8.1) by Elci\n");

    printf("Geben Sie die Anzahl der neuen Eintraege ein: ");
    scanf("%d",&z);
    if(z<=0)
    {

    printf("\n\nNur Werte > 0 werden von dem Programm verarbeitet!!");
    getch();
    clrscr();
    exit(2);

    }
    else
    {
    clrscr();
    pa = (struct Satz 😉 malloc(sizeof(Satz) * z);

    for(int j=0;j<z;j++)
    {
    pb = &pa[j];
    read_satz(pb);

    }

    for (int k=0;k<z;k++)
    {

    for(int l=0;l<z;l++)
    {
    pb = &pa[k];
    pc = &pa[l];
    sort_satz(pb,pc);

    }
    }
    clrscr();
    for(int x=0;x<z;x++)
    {
    pb = &pa[x];
    view_satz(pb);
    }

    printf("\n\n\n1) Dateien speichern\n2) Beenden\nIhre Wahl: ");
    scanf("%d",&save);

    if(save ==1)
    { clrscr();
    printf("Der Inhalt der Datei Telefon.eme\n\n");
    for(int e=0;e<z;e++)
    {

    ps = &pa[e];
    save_satz(ps);

    }
    cout <<endl<<"ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ"<<endl<<endl<<"***Die Eintraege wurden erfogreich gespeichert***"<<endl;

    getch();
    }
    else
    {
    printf("\n\nProgramm mit Enter beenden!\n\n");

    getch();
    exit(2);
    }

    free(pa);

    }

    }

    void read_satz (struct Satz *pa)
    {

    printf("\nÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ");
    printf("\n\nNachname: ");
    fflush(stdin);
    scanf("%s",pa->name);
    printf("\nVorname: ");
    fflush(stdin);
    scanf("%s",pa->vorname);
    printf("\nTelefon Nr.: ");
    fflush(stdin);
    scanf("%s",pa->tel);
    printf("\nÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ");

    }
    void view_satz (struct Satz *pa)
    {
    printf("\n\nÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\n\n");
    printf("Name, Vorname: %s, %s\n",pa->name,pa->vorname);
    printf("Telefon Nr.: %s",pa->tel);

    }

    void sort_satz (struct Satz *pa,struct Satz *pb)
    {
    long int name = compare_satz(pa,pb,1);

    if(name ==0)
    { name = compare_satz(pa,pb,2);
    if(name<0)change_satz(pa,pb);
    else
    {
    if(name==0)
    {
    name = compare_satz(pa,pb,3);
    if(name>0)change_satz(pa,pb);
    else;
    }
    }
    }
    else
    {
    if(name <0) change_satz(pa,pb);
    else;
    }

    }

    void change_satz (struct Satz *pa,struct Satz *pb)
    {

    struct Satz hilf;
    hilf = *pa;
    *pa = *pb;
    *pb = hilf;

    }
    long compare_satz (struct Satz *pa, struct Satz *pb, int status)
    {
    long int name;
    int dif;
    switch(status)
    {
    case 1: name = strcmp(pa->name,pb->name);
    return name;
    break;

    case 2 :name =strcmp(pa->vorname,pb->vorname);
    return name;
    break;
    case 3 : dif = pa->tel - pb->tel;
    printf("%d",dif);
    if(dif>0) return 1;
    else
    {
    if(dif<0)return -1;
    else return 0;
    }
    break;
    }
    }
    void save_satz (struct Satz *pe)
    {

    FILE *d;

    d = fopen("C:\\Telefon.eme","a");
    fprintf(d,"\n\n");
    fprintf(d,"%s",pe->vorname);
    fprintf(d," %s",pe->name);
    fprintf(d,"\n");
    fprintf(d,"%s",pe->tel);
    fclose(d);
    d = fopen("C:\\Telefon.eme","r");

    for(int i=0;!feof(d);i++)
    {
    fflush(stdin);
    fscanf(d,"%s",pe->name);
    fflush(stdin);
    fscanf(d,"%s",pe->vorname);
    fflush(stdin);
    fscanf(d,"%s",pe->tel);
    /*printf("\n %s ",pe->vorname);
    printf("%s ",pe->name);
    printf("%s",pe->tel);
    */
    view_satz(pe);
    }
    fclose(d);

    }
    🙂 🙂 🙂 🙂 🙂 🙂 🙂



  • Hy,
    ich hätte jetzt nochmal 'ne Frage zu deinem Code, der vielleicht nicht ganz zum Thema passt:

    Ganz am Ende steht sowas wie:

    for(int i=0;!feof(d);i++)
    {
    fflush(stdin);
    fscanf(d,"%s",pe->name);
    fflush(stdin);
    fscanf(d,"%s",pe->vorname);
    fflush(stdin);
    fscanf(d,"%s",pe->tel);
    }

    Damit liest du doch einzelne Wörter aus einer Textdatei, oder?
    Könntest du mir das Bitte genauer erklären?
    Was soll "fflush(stdin)" bewirken und wie funktioniert ganz genau "fscanf(d,"%s",pe->vorname)"?
    Danke



  • Ja diese Funktion liest die Variablen, aus der Datei "telefon.eme" auf die der FILE Zeiger d gesetzt wurde!
    ZUM fscanf:

    *******
    #include <stdio.h>
    int fscanf(FILE *stream, const char *format[, address, ...]);

    Beschreibung

    Liest und formatiert Eingaben aus einem Stream.
    fscanf liest eine Reihe von Eingabefeldern zeichenweise aus einem Stream. Entsprechend den Formatierungsanweisungen, die fscanf im Formatstring format übergeben wurden, wird jedes Feld gelesen, formatiert und an einer Adresse gespeichert, die nach format übergeben wurde. Die Anzahl der Formatierungsanweisungen, der übergebenen Adressen und der Eingabefelder müssen übereinstimmen.

    Hinweis: Unter der Funktion scanf finden Sie eine ausführliche Beschreibung der Formatierungsanweisungen.

    fscanf kann das Lesen eines bestimmten Eingabefeldes abbrechen, bevor das normale Feldende (ein Whitespace-Zeichen) erreicht ist. fsanf kann auch aus verschiedenen Gründen den Lesevorgang vollständig abbrechen. Die möglichen Ursachen hierfür werden unter scanf erläutert.

    Rückgabewert

    fscanf liefert die Anzahl der fehlerfrei gelesenen und gespeicherten Felder zurück. Gelesene, aber nicht gespeicherte Felder werden nicht mitgezählt.
    Der Versuch, über das Ende einer Datei hinauszulesen, ergibt den Wert EOF. Wenn überhaupt keine Felder gespeichert wurden, wird 0 zurückgeliefert.

    ***************************************************
    fflush(stdin)

    Syntax

    #include <stdio.h>
    int fflush(FILE *stream);

    Beschreibung

    Leert einen Stream.
    fflush erzwingt bei gepufferten Ausgabe-Streams ein Schreiben eventueller Pufferinhalte, sorgt also dafür, daß ausgegebene Daten in die zugehörige Datei geschrieben werden.
    Der durch stream bezeichnete Stream bleibt offen. Auf ungepufferte Streams hat fflush keine Auswirkung.

    Rückgabewert

    Bei fehlerfreier Ausführung liefert fflush den Wert 0, im Fehlerfall den Wert EOF zurück.


Anmelden zum Antworten