Acsii Datei auslesen



  • Hallo zusammen!

    Ich möchte aus einer Ascii Datei mit folgender Struktur:

    Ausgangsdicke = 5
    Fertigungsdicke = 5
    Breite = 5.5
    Materialart = Kupfer
    .
    .
    .

    die Werte auslesen und in eine Datenstruktur schreiben. Dabei ist die fertige Struktur viiiiel länger als die oben angegebene. Kann mir jemand ein paar Hilfestellungen oder ein Beispielcode geben wie ich soetwas mache? Der zweite Schritt wäre, dass das ganze auch noch anpassbar wäre. D.h. das ich z.B. zu der obigen Acsii Datei einfach einen weiteren Attribut hinzufüge wie Laenge=40, oder auch die Ausgangsdicke wieder entferne, sprich das ganze soll flexibel auf verschiedene Datenstrukturen anwendbar sein. Geht sowas?
    Das Problem ist nämlich das das ganze am Ende Projekt unabhangig sein soll und jedes Projekt hat eine etwas andere Struktur an Daten 😢

    Hoffe mir kann jemand etwas weiterhelfen und guten Rat geben. Vielleicht gibt es ja eine bessere und/oder einfachere Lösung als mit einer Ascii-Datei. Das ganze soll Linux und evt. auch Windows laufen.

    Vielen Dank schonmal im Vorraus

    Viele Grüße,

    Dennis



  • Schau mal hier, es wurde das gleiche diskutiert

    http://www.c-plusplus.net/forum/viewtopic.php?t=44012

    Dein file zeilenweise lesen am bis einschließlich Gleichheitsuzeichen alle entfernen, den wert mit sscanf wandeln und den gewandelten Wert in deine Struktur an der richtigen Stelle zuweisen.

    das Verfahren ist auch erweiterbar



  • Vielen dank für die schnelle Antwort. Hab es anhand des anderen Topics auch halbwegs hinbekommen. Allerdings gefällt mir der Weg das ganze anhand eines Acsii-Files darzustellen noch nicht so ganz. Das Problem ist, dass es sehr viele Daten sind, die von verschiedenen Typen sind ( float, long, char ) und von Projekt zu Projekt verschieden strukturiert sind. Habt ihr da vielleicht ein paar Ideen oder Ratschläge für mich? Das ganze muss auch halbwegs übersichtlich aussehen, da es auch vom Anwender verändert werden kann.

    Viele Grüße,

    Dennis



  • Würde gerne Helfen verstehe das Problem noch nicht ganz, poste etwas ausführlichewr was du tun sollt oder willst



  • Also:

    Bei unseren Projekten gibt es mehrere riesige Header Files, in denen automatisch erstellte Strukturen stehen. Aus diesen Strukturen werden über bestimmte Routinen Sollwerte berechnet. Normalerweise stehen die benötigten Daten in verschiedenen Datenbanken und Programmen. Mein Programm soll nun aber zum Einsatz kommen, wenn der Kunde nach bestimmten Sollwerten fragt, unser gesamtes Projekt aber noch gar nicht existiert ( also wir uns noch in der frühen Entwicklungsphase befinden ).An sich möchte der Kunde nur aus einer Handvoll Daten die er eingibt, die Sollwerte berechen können. Um diese zu berechnen werden aber all die anderen Daten, die normalerweise in unseren Datenbanken stehen, mit benötigt.
    Deshalb wollte ich ein Acsii-File oder dergleichen erstellen in dem der Inhalt der Daten steht, jedoch trotzdem noch vom Kunden verändert werden kann. Diese Daten würden dann denen aus den Datenbanken entsprechen, die ja zu diesem Zeitpunkt noch nicht existieren ;-). Sie dienen aber hauptsachlich internen Berechnungen, deshalb möchte ich diese nicht direkt auf der Benutzeroberfläche darstellen, da dies viel zu viele Daten aufeinmal wären und man die Übersicht verliert.

    Also das sieht etwa so aus:

    ####Bedienoberfläche#####
    #			#
    #    Material:	_____	#
    #    Dicke:     _____   #
    #    Länge:     _____   #			Vorgabe-Daten
    #			#			(Acsii-File)
    # --------------------	# ------------------>>>	atr1=34
    # | SOLLWERTE-BUTTON |	#			atr2=12.4
    # --------------------  #			atr3=hallo Welt
    #			#			    .
    # Sollwert-Ausgabe:  	#			    .
    #			#			    .
    # Irgendeine Tabelle    #
    #########################
    

    Hoffe das war verständlicher.

    Gruß,

    Dennis

    [edit Shade]Code Tags hinzugefügt - jetzt ists n bisschen besser lesbar[/edit]



  • Sorry, das Bild am Ende sah bei mir eben noch ein wenig anders aus 😢



  • Musst du entweder als Zitat oder als Code posten dann verrückt da nix.

    Aber du wirst wohl afaik nicht drumrum kommen das ganze wort für Wort einzulesen.



  • hmm, ja leider sehe ich bisher auch keine bessere Möglichkeit 😞



  • Nachdem die Methoden oben beschrieben wurden, rate ich dir für jede unterschiedliche Stuktur die du füllen mußt eine eigene Lesefunktion zu schreiben. In dieser Lesefunktionen solltest du darauf achten das sie nicht Reihenfolgenahhängig sind. Kunden neigen dazu solche Dateien umzusortieren, und beschweren sich anschließens das das Programm nicht funktioniert oder taugt. Für jede Struktur eine eigene Funktion deshalb, Kunden neigen dazu im Projektablauf die Inhalt zu ändern.

    while (0 == feof(fp))
      {                                              
        fgets(buffer,256,fp); // read next line
        // Entferne Blanks am Anfang einer Zeile (würde ich als Funktion implementieren)
        // Entferne Commentarzeilen  (würde ich als Funktion implementieren)
    
      if (0==_strnicmp(buffer,"Material",8)) // ist es der Item Material
              { // falls ja auswerten
              //Trenne String am ":" auf
                Konvertiere den Wert und Trage Ihn in die Struktur ein
                continue; // dadurch wird die Routine mit dem Lesen der nächsten Zeile fortgesetzt
              }
    
      if (0==_strnicmp(buffer,"Dicke",5))
              {
              //Trenne String am ":" auf
                Konvertiere den Wert und Trage Ihn in die Struktur ein
                continue;
              }
       ......
    
      } // Ende While
    

    In deinem File sollten Zeilen ohne Werte (Kommentarzeilen) immer mit einem bestimmten Zeichen beginnen, deine Wahl mit '#' ist gut.
    Zeilen in denen Werte stehen sollten ohne dieses Kommentarzeichen sein.

    Wir haben bei uns mit dieser Art von Files schon und der oben aufgeführten Behandlung gute Erfahrung gemacht.

    🙂 Viel Spa0, falls noch Fragen sind einfach posten 🙂



  • @PAD: Deine Methode zum Lesen der Zeilen ist nicht besonders gut gewählt. Du solltest das in etwa so machen:

    while (fgets( ... )) { ... }
    


  • Teilweise akzeptiert. Deine Methode ist ebenfalls in Ordnung.

    Ich habe das Beispiel aus einem CodeStück von uns zusammengekürzt. Wir haben in der while Schleife vor dem fgets noch ein paar Aktionen stehen, die hier nicht gebraucht werden.



  • PAD schrieb:

    Teilweise akzeptiert. Deine Methode ist ebenfalls in Ordnung.

    Ich habe das Beispiel aus einem CodeStück von uns zusammengekürzt. Wir haben in der while Schleife vor dem fgets noch ein paar Aktionen stehen, die hier nicht gebraucht werden.

    Nehmen wir einmal dieses einfache Programm:

    #include <stdio.h>
    
    int main(void)
    {
        while (!feof(stdin)) {
            char line[100];
            fgets(line, sizeof line, stdin);
            puts(line);
        }
        return 0;
    }
    

    und eine kleine Textdatei (t.txt):

    1
    2
    3
    

    Nach der letzten Zeile steht ebenfalls ein new-Line (\n). Wenn Du obiges Programm mit

    prg < t.txt
    

    aufrufst, wird die letzte Zeile (3) zweimal ausgegeben. IMHO ist das ein Fehler.

    Dieser Code ist nicht nur kürzer sondern führt auch zur richtigen Ausgabe:

    int main(void)
    {
        char line[100];
        while (fgets(line, sizeof line, stdin)) {
            puts(line);
        }
        return 0;
    }
    

    siehe hierzu auch noch: http://www2.informatik.uni-wuerzburg.de/dclc-faq/kap11.html#11.5



  • @mady Muss dich enttäuschen.
    Habs gerade ausprobiert beide Lösungen liefern dasselbe (Visual C++ 6.0).
    Ist auch klar.
    Dadurch das fgets nur die neue Zeile bekommt, wird der Eingabebuffer nicht geändert.
    meine Version in deiner Codierung funktioniert, wenn man 'char line...' wie folgt abändert

    #include <stdio.h> 
    
    int main(void) 
    { 
        while (!feof(stdin)) { 
            char line[100]=""; 
            fgets(line, sizeof line, stdin); 
            puts(line); 
        } 
        return 0; 
    }
    

    Trotzdem Danke, denn ich hab in meinem Orginal eine Zeile zuviel gelöscht.

    ➡ @DennisF83 bitte den Anfang so abändern

    while (0 == feof(fp)) 
      {                                               
        buffer[0]=0x00;// Damit ist der per Definitionem leer
        fgets(buffer,256,fp); // read next line 
        // Entferne Blanks am Anfang einer Zeile (würde ich als Funktion implementieren) 
        // Entferne Commentarzeilen  (würde ich als Funktion implementieren)
    


  • Hallo!

    Sorry das ich mich garnicht mehr gemeldet habe. Ich war für eine Woche im Urlaub, aber jetzt bin ich ja wieder da und werd mich gleich mal ans coden ransetzten. Vielen dank erstmal für die Antworten. Werd mich wieder melden falls ich noch Fragen habe.

    Schöne Grüße,

    Dennis


Anmelden zum Antworten