Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Datensätze aus *.txt in Feldern speichern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
05.03.2008, 12:52 Uhr
derkaiser182



hallo!

bin neu hier und habe noch nirgendwo etwas passendes zu meinem problem gefunden.

und zwar folgendes. die aufgabe besteht darin, datensätze die zeilenweise in einer datei gespeichert sind und jeweils aus 4 daten bestehen die durch "geeignete Trennzeichen" voneinander separiert sind in felder einzulesen. die ersten, zweiten... daten in jeweils ein feld. die in den feldern gespeicherten daten sollen vom typ double sein.

davor gilt es zu überprüfen, wieviele datensätze die datei enthält.

ich bin davon ausgegangen, dass die daten durch ';' voneinander getrennt sind und habe mir auch mal eine "dummy"-datei geschrieben mit der ich mein programm teste.

hier mal meine bisherigen ergebnisse:


C++:
#include <stdio.h>
#include <string.h>

int main()
{
    double s, *t, *x, *y, *z;
    int n=0, i=0, k=0;
    char *zeile;
        
    FILE *datei = fopen("flugdaten.txt", "r");
    
    do
    {
         s = fgetc (datei);
         if (s == ';')              /*Annahme: die Werte sind durch ; getrennt*/
         n +=1;
    }
    while (s != EOF);
    
    printf ("Die Datei enthaelt %d Datensaetze!", n/4);
    fclose (datei);
    
    t =   (double*)malloc(n*sizeof(double));  
    x =   (double*)malloc(n*sizeof(double));
    y =   (double*)malloc(n*sizeof(double));
    z =   (double*)malloc(n*sizeof(double));
    zeile = (char*)malloc(n*sizeof(char));
    
    fopen("flugdaten.txt", "r");
    for(i=0; i<=n; i++)
    fgets(zeile, 256, datei);
    sscanf (zeile, "%lf%lf%lf%lf", &t[i], &x[i], &y[i], &z[i]);
    
    for (k=0; k<n; k++)
    printf("\n%lf %lf %lf %lf", t[k], x[k], y[k], z[k]);
    
    fclose (datei);
    
    free(t);
    free(x);
    free(y);
    free(z);
}


hier auch nochmal der inhalt meiner dummy-datei:

1,0;4245,95;2342;2424;
2,0;23423,243;23423,234;23423,23424;
3,0;2423,234;2445,53;35345;667;
4,0;435,34;3453,345;3656,34;

grüße!
christian

Dieser Post wurde am 05.03.2008 um 14:04 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.03.2008, 14:06 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Was genau meinst du denn wäre völlig "unpassend" an deinem Ansatz. Ich verstehe die Frage nicht so richtig bzw. worauf du genau hinaus willst
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.03.2008, 14:21 Uhr
derkaiser182



also ich speichere ja jede zeile meiner datei zuerst in den string "zeile" und dann lese ich mit sscanf aus diesem string die einzelnen daten aus. das problem liegt jetzt darin, dass ich nicht weiß, wie ich die ; als trennzeichen für die einzelnen daten verwenden soll...also ich kriegs nicht hin, dass er erkennt, dass die erste date bis zum 1. ; geht und danach die 2. date beginnt. und ich auch nicht weiß, wie ich die dann einzeln speichern soll...
ich könnte mir noch vorstellen, die daten alle zuerst in einem feld zu speichern und dann mit dem modulo-operator die einzelnen feldelemente rauszufiltern aber laut aufgabenstellung sollen nur die 4 felder für die daten benutzt werden und sonst keine weiteren. (was ich ja auch schon nicht mehr eingehalten habe)
wenn ich mir die feldelemente ausgeben lasse kommt da totaler quatsch raus weil er anscheinend auch die ; mit einliest...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.03.2008, 14:38 Uhr
Kest
saint


Hi!

In der dritten Zeile der "dummy"-datei sind zu viel Daten.
>3,0;2423,234;2445,53;35345;667;< = 5
Besser wäre, wenn du als Dezimalpunkt "." statt "," verwendest, dann könnteste so etwas in die Richtug machen:

C++:
#include <stdio.h>

int main(void)
{
    FILE *file;
    if((file = fopen("a.txt", "r"))==NULL)
        return 1;

    double a,b,c,d;
    while(fscanf(file, "%lf;%lf;%lf;%lf;", &a,&b,&c,&d)!=EOF)
        printf("%f und %f und %f und %f\n", a, b, c, d);

    fclose(file);

    return 0;
}

Wenn du aber die deutschen Schreibweise beibehalten willst, dann könnteste >locale< nutzen:

C++:
#include <stdio.h>
#include <locale.h>

int main(void)
{
    FILE *file;
    if((file = fopen("a.txt", "r"))==NULL)
        return 1;

    setlocale(LC_NUMERIC, "german");

    double a,b,c,d;
    while(fscanf(file, "%lf;%lf;%lf;%lf;", &a,&b,&c,&d)!=EOF)
        printf("%f und %f und %f und %f\n", a, b, c, d);

    fclose(file);

    return 0;
}

Natürlich, wenn deine C-Realisierung deutsche Sprache unterstützt.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.03.2008, 16:02 Uhr
derkaiser182



konnte das problem jetzt lösen...und zwar mit der funktion fscanf mit der man formatiert aus dateien lesen kann. wusste nicht, dass es diese funktion gibt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.03.2008, 20:13 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


wobei ich immer eher dazu neige ganze Zeilen einzulesen und diese dann zu parsen. In c dann mit sscanf nach einem fgets
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: