Zeilen und Spalten aus Datei auslesen



  • Hey,

    ich versuche gerade im Rahmen einer Projektarbeit eine Benutzeroberfläche zu programmieren. Das Main-Programm ist dabei in c++ geschrieben. Da ich allerdings kaum Programmiererfahrung habe, sind meine Lösungen sehr umständlich und ich benötige Hilfe um mein Programm zu verbessern. In einem Teil des Programs muss ich aus einer .dat Datei Daten einlesen, welche dort in Zeilen und Spalen abgespeichert sind. Und hier meine Frage: Gibt es einen einfacheren Weg bestimmte Zeilen und Spalten einzulesen als ich es in dem untenstehenden Code getan habe?
    Im untenstehenden Code habe ich Daten mit nur 4 Spalten. Allerdings muss ich bald auch Daten mit 50 Spalten oder mehr einlesen, was mit meiner Methode doch sehr umständlich erscheint. Zudem will ich eigentlich nur bestimmte Spalten, z.B Spalte 4 bis zur letzten Spalte, einlesen.

    File *fpresult;
    int i;
    double pos[66];
    double den[66];
    double d1;
    double d2;
    double d3;
    double d4;
    char buf[1000];
    sprintf(buf,"./density.dat");
    if (VERBOSE==YES) printf("Opening File: %s\n", buf);
    fpresult=fopen(buf,"r");
    if (fpresult==NULL){
    printf("Main can not open file: %s",buf); fflush (stdout); system ("sleep 1"); exit (1);}
    j=1;
    while ((fscanf(fpresult,"%lf %lf %lf %ls\n", &d1, &d2, &d3, &d4)) !=EOF){
    pos[j]=d1;
    den[j]=-d4;
    j++;
    fclose (fpresult);
    

    Wie ihr seht bin ich ein totaler Anfänger. Ich würde es gerne hinbekommen, dass ich die Daten, die ich nicht haben will, sprich d2 und d3 auch nicht auslesen muss. Auch ist es mir nicht mölich folgende Sachen in mein Programm zu integrieren:

    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <limits>
    

    weil mein Tool auf einem externem Server laufen wird und ich dort nichts zusätzliches hochladen kann.

    Vielen Dank für eure Hilfe 🙂

    Grüße
    Laura


  • Mod

    Erst einmal direkt vorweg: Welche Sprache soll das werden? Du fragst im C++-Forum; dein Code ist C; die Sachen, die du integrieren möchtest, sind C++ (hast du die als Tipp woanders her bekommen?).

    Wenn du nur C sprichst, wirst du die C++-Antwort nicht verstehen. Und umgekehrt vermutlich auch nicht.

    Allgemein ist der Trick, dass du die Spalten nicht fest einprogrammierst, sondern es genau so behandelst, wie du die Zeilen behandelst. Wie du die Zeilen behandelst, hängt natürlich sowohl von der Sprache, als auch deinen Fähigkeiten in dieser Sprache ab.



  • 3Laura3 schrieb:

    Und hier meine Frage: Gibt es einen einfacheren Weg bestimmte Zeilen und Spalten einzulesen als ich es in dem untenstehenden Code getan habe?
    Im untenstehenden Code habe ich Daten mit nur 4 Spalten. Allerdings muss ich bald auch Daten mit 50 Spalten oder mehr einlesen, was mit meiner Methode doch sehr umständlich erscheint.

    double d[4]; und eine Schleife. Die kannste dann aufmotzen zu 50 statt 4 ohne nennenswerten Aufwand.

    3Laura3 schrieb:

    Zudem will ich eigentlich nur bestimmte Spalten, z.B Spalte 4 bis zur letzten Spalte, einlesen.

    "lesen" musst Du alle. Ignorieren geht nur durch "weglesen" in eine dummy-Variable. Es kann daher auch einfacher sein, alle ins Array zu lesen und die nützlichen Daten ins Ziel zu kopieren.



  • Hallo Laura,

    3Laura3 schrieb:

    Auch ist es mir nicht möglich folgende Sachen in mein Programm zu integrieren:

    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <limits>
    

    weil mein Tool auf einem externem Server laufen wird und ich dort nichts zusätzliches hochladen kann.

    Ein #include <irgendwas> hat zunächst mal nichts damit zu tun, wo Dein ausführbares Programm später läuft. Du hast sowohl unter C als auch unter C++ die Möglichkeit Libraries statisch zu binden. Damit wird dann ein File (unter Windows z.B. ein .exe) beim Generieren erzeugt, welches autark läuft. Hauptsache das Betriebssystem passt.
    Bem.: Ein 'include' ist selbst zunächst mal keine(!) Library, aber i.A. wird zusätzlich zum include eine Library benötigt.

    Wie kommst Du zu dieser Information, dass ein #include <iostream> usw. für Dich nicht in Frage kommt?

    Gruß
    Werner



  • Wenn der Inhalt einer Zellen eine feste Groesse hat kannst du aus der Datei auch direkt bestimmte Sachen auslesen und den Rest ueberspringen.



  • Vielen Dank für die schnellen Antworten!!! Ich soll meinen Code jetzt doch in C lassen. Dann poste ich diesen Beitrag nochmal in einem anderen Forum.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum C (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Wenn die Anzahl der Spalten immer gleich ist (sein muss), kannst du fscanf benutzen, wenn nicht dann musst du zeilenweise lesen (z.B. fgets) und danach jeweils die als String gelesene Zeile elementweise auswerten (mit sscanf,strtok,oder manuell).



  • Vielen Dank! Es hat funktioniert.



  • Mein naechstes Problem ist, dass ich eine Datei auslesen moechte in der ein mittels base64 encoded Bild abgespeichert ist.
    Im Moment sieht mein Code folgendermassen aus:

    char line3[2000000];
    char buf[1000];
    FILE *fpimage;
    sprintf(buf,"./converted.txt");
    if(VERBOSE==YES) printf("Opening file: %s\n",buf);
    fpimage=fopen(buf,"r");
    if(fpimage==NULL){
    printf("mainc cannot open file %s!\n,buf"); fflush(stdout); system("sleep 1"); exit(1);
    }
    while((fgets(buf,500000,fpimage)) !=NULL){
    sprintf(line3,"%s\n",fgets(buf,500000,fpimage));
    rpPutString(io,"output.image(curden).current",line3,RPLIB_APPEND);
    }
    fclose(fpimage);
    

    Dieser Code funktioniert aber leider nicht.



  • Du liest doppelt ein.
    Lösung:

    sprintf(line3,"%s\n", buf);
    

    Und wieso übergibst du bei fgets 500000 als Größe, wenn dein Puffer 'buf' nur 1000 groß ist???
    Und line3 mit 2MB zu definieren ist wohl auch etwas groß (hat dein System überhaupt soviel Stackspeicher?).
    Du solltest dich auch fragen, ob du line3 überhaupt benötigst (so kopierst du einfach nur sinnlos den String nochmals um)?



  • Vielen Dank!
    Es funktioniert jetzt. Ich werde den Rest des Programms mit deinen Tips ueberarbeiten. Die unterschiedlichen Groessen kommen daher, dass ich mich mit C nicht all zu gut auskenne. Da ist mit wohl ein Fehler unterlaufen.
    Danke!


Log in to reply