Acsii Datei auslesen
-
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