Datenverarbeitung - Veränderung einer Zeile
-
Gesucht ist: In allen Zeilen, in denen eine Änderung vorgenommen wurde, ist als "Bemerkung 2" (Wortindex 72) das Kürzel E + Nummer einzufügen. Bereitsvorhandene Bemerkungen sind dabei zu überschreiben.
Habe ein absolut lauffähiges Programm geschrieben - und Verzeihung, wenn ich nicht alles reinkopiere, es über 300 Zeilen. Habe versucht nur Relevantes einzustellen (die Hälfte des Programmes bezieht sich auf das Öffnen der Datei) - jedoch schaffe ich den oben stehenden Punkt nicht einzubauen. Entweder schreibt es mir einfach in jeder Zeile eine Bemerkung, egal ob bearbeitet oder nicht, oder es schreibt gar keine. Ausserdem soll ich ja auch eine Bemerkung erstellen, wenn noch kein 72 Wort Index vorhanden ist.
Sehe mein Problem darin, dass mein Auswertung in zwei verschiedenen Funktionen steht und somit meine edit-Variable ständig neu definiert wird.
Möchte edit sozusagen als flag setzen, um so eine bearbeitete Zeile anzuzeigen und somit die Bemerkung einfügen.Hier mein Quelltext:
void einlesen(FILE *file_er, FILE *file_ew) // Funktion zum Einlesen in die Datei { #define MAX 100 // Maximale Zeilenlänge definiert char zeile_[MAX]; char *spalte, *zeile; int spalten_zaehler = 0; printf("Bearbeitungsstatus:\n"); while (zeile = fgets(zeile_, MAX, file_er)) { spalte = strtok(zeile, " "); // Unterteilung einer Zeile in Spalten - getrennt durch Leerzeichen for (spalten_zaehler = 0; spalte != NULL; spalten_zaehler++) // Spalten durchgehen um die einzelnen Spalten auszuwerten { spalte_formatiert(spalte, file_ew); // Aufruf Funktion zum Umschreiben fprintf(file_ew, " %s", spalte); // Schreibe Spalte in _edit-File spalte = strtok(NULL, " "); // Aufteilen bis NULL zurückkommt (dann ist nichts mehr zum Aufteilen da } } } void spalte_formatiert(char *spalte, FILE *file_) { int WI, info_data; // Namen nach Aufbau GSI-Block char GSI_data[9]; char *leer = "00000000"; char bemerkung[] = "E1131501"; int flag, winkel, winkel_neu, info_winkel; int altgrad_zahl = 323; sscanf(spalte, "%2d", &WI); switch(WI) { case 11: // Zielpunkt sscanf(spalte, "%*2d%04d+%8s", &info_data, &GSI_data); // * bedeutet "Überspringen" nummer_zielpunkt++; if (strncmp(GSI_data, leer, 8) == 0) { printf("Zielpunkt (%s) wird bearbeitet ...\n", spalte); sprintf(spalte, "%2d%04d+%08d", WI, info_data, zielpunkt); zielpunkt++; edit = 1; } else // Wenn Buchstabe vorkommt, kann GSI_data nicht Null sein!! { gross(GSI_data, &flag); if (flag == 1) sprintf(spalte, "%02d%04d+%08s", WI, info_data, GSI_data); edit = 1; } break; case 41: // Standpunkt case 42: // Standpunktnummer sscanf(spalte, "%*2d%04d+%8s", &info_data, &GSI_data); nummer_standpunkt++; if (strncmp(GSI_data, leer, 8) == 0) { edit = 1; printf("Standpunkt (%s) wird bearbeitet ...\n", spalte); sprintf(spalte, "%2d%04d+%08d", WI, info_data, standpunkt); standpunkt++; } else { gross(GSI_data, &flag); if (flag == 1) { sprintf(spalte, "%02d%04d+%08s", WI, info_data, GSI_data); edit = 1; } } break; case 21: // Richtungswinkel case 22: // Zenitwinkel sscanf(spalte,"%*2d.%d+%8d", &info_data, &winkel); // Letztes nicht als String, da damit gerechnet wird if (info_data == altgrad_zahl) { edit = 1; printf("Altgrad werden in Gon (%s) umgerechnet ...\n", spalte); winkel_neu = umrechnung(winkel); sprintf(spalte, "%2d.%d+%08d", WI, info_data - 1, winkel_neu); anzahl_winkel++; } break; }
Da mir edit immer auf 0 gesetzt wurde für jedes Mal, wenn ich in die Funktion eingestiegen bin, habe ich edit mittlerweile als Globale Variable definiert (gefällt mir aber nicht als Lösung und funktioniert auch nicht!).
Bitte höflichst um Hilfe - bin am Verzweifeln. Will das Programm endlich fertig haben
Hier noch ein kleiner Auszug aus dem .GSI-Format, damit man sich etwas darunter vorstellen kann:
410002+00000001 42....+20101115
410004+00000004 42....+00000061
410045+00pp1001 42....+00000001 43....+00000000 44....+000020.7 45....+00000970
110005+00000000 21.323+06847101 22.323+08999838 31..06+00265094 72....+00000000 51..1.+0000+018 71....+00.00000
110006+00000502 21.323+06847101 22.323+08999838 31..06+00265094 72....+00000000 51..1.+0000+000 71....+00.00000
110007+00000503 21.322+07607890 22.322+09999830 31..06+00265094 72....+00000000 51..1.+0000+000 71....+00.00000
110008+00000504 21.322+07607890 22.322+09999820 31..06+00265093 72....+00000000 51..1.+0000+000 71....+00.00000
110009+00000000 21.322+07607900 22.322+09999820 31..06+00265094 72....+00000000 51..1.+0000+000 71....+00.00000
110010+00000506 21.322+27607760 22.322+30000030 31..06+00265095 72....+00000000 51..1.+0000+000 71....+00.00000
-
Update: Habe das Problem mit meinem Edit-Flag gelöst! (: Einfach in die Funktion eine weitere Variable reingeschickt und mittels Pointer ausgewertet (dh in der Funktion spalte_formatiert ist es immer nur *edit = 1).
Macht auch alles ganz brav, was ich will ... AUSSER: Ich sollte eine Spalte EINFÜGEN, sollte noch keine Bemerkungszeile mit dem WI 72 bestehen. In meinem Fall überschreibt es jedoch die Spalte.
Habe schon versucht einfach noch einen weiteren String einzubauen etc. Aber so einfach ist es leider nicht. Könnte mir vorstellen, dass mein Fehler irgendwo in meiner else if liegt.Stelle euch das Stückchen Code rein, dass mir gerade Kopfzerbrechen bereitet - einfach im vorherigen Quelltext ab Aufruf der Funktion spalte_formatiert (blöder Name, suche noch nach etwas Besserem ^^) einfügen.
Wäre sehr verbunden, wenn mir da jemand weiterhelfen könnte. Dann hätte ich das Programm ENDLICH fertig!
spalte_formatiert(spalte, file_ew, &edit); // Aufruf Funktion zum Umschreiben if (edit == 1) { sscanf(spalte, "%2d", &WI); if (WI == 72) { sscanf(spalte, "%*2d....+%8s", &GSI_data); sprintf(spalte, "%2d....+%s", WI, bemerkung); anzahl_edit++; edit = 0; } else if (spalten_zaehler == 4) { sprintf(spalte, "72....+%s\n", bemerkung); //sprintf(spalte, "%s", spalte); anzahl_edit++; edit = 0; } }
Bei mir sieht die Ausgabe so aus:
410045+00PP1001 42....+00000001 43....+00000000 44....+000020.7 72....+E1131501
110005+00009000 21.322+07607890 22.322+09999820 31..06+00265094 72....+E1131501 51..1.+0000+018 71. ...+00.00000Sollte aber so aussehen:
410045+00PP1001 42....+00000001 43....+00000000 44....+000020.7 72....+E1131501 45....+00000970
110005+00009000 21.322+07607890 22.322+09999820 31..06+00265094 72....+E1131501 51..1.+0000+018 71. ...+00.00000
-
Hast du da ein '\n' an der falschen Stelle?
Und bei xscanf kommt bei %s kein & bei der Variable:
nusskipfa schrieb:
sscanf(spalte, "%*2d%04d+%8s", &info_data, &GSI_data) // ^
-
Habe das \n eingefügt, weil sonst die Formatierung nicht mehr stimmt. Sollte aber am Ende nicht mehr gebraucht werden. Ist also nur zur Übersichtlichkeit zum Kontrollieren ob ich es endlich geschafft habe
Irgendetwas passt da einfach nicht bei meiner else if ... Es sollte eben nicht die Spalte Nr. 4 überschreiben sondern nur um eine Spalte verrücken.
Ansonsten stimmt eigentlich alles ...Habe das & jetzt weggelassen, ändert nur leider nichts an meinem Problem
-
Überschreiben tut der da nichts.
Du gibst das nicht aus.nusskipfaL schrieb:
Habe das & jetzt weggelassen, ändert nur leider nichts an meinem Problem
Ich habe auch nicht behauptet, dass es daran liegt. Ist trotzdem ein Fehler gewesen.
-
Habs jetzt ... (: Funktionsfähiges "FERTIGES" Programm.
Hab das Ganze nicht mehr als sprintf verwendet sondern mit fprintf in die Datei geschrieben. Somit ist auch das \n wieder überflüssig. (:
-
nusskipfaL schrieb:
Habe ein absolut lauffähiges Programm geschrieben ... über 300 Zeilen. ... die Hälfte des Programmes bezieht sich auf das Öffnen der Datei
Alle Achtung ...
-
Belli schrieb:
nusskipfaL schrieb:
Habe ein absolut lauffähiges Programm geschrieben ... über 300 Zeilen. ... die Hälfte des Programmes bezieht sich auf das Öffnen der Datei
Alle Achtung ...
ROTFL!