Hilfsprogramm in c++

hatebrotherone

Grünschnabel
Hallo Leute,

bin noch C++ Neuling, fand es aber Interessant & Sinnvoll mich mit der Thematik auseinander zu setzen. Nun hab ich auch schon ein wenig in Büchern gewälzt und mir überlegt ein Hilfsprogramm für meine tägliche Arbeit zu schreiben.

Mein Problem:

Eine Maschine erzeugt täglich mehrere Seiten Messprotokolle in .txt- files, die alle gleich aufgebaut sind: Kopf mit 20 Zeilen, dann Messergebnisse.
Diese werden dann händisch zusammengefasst in ein Protokoll, wobei nur einmal der Kopf stehen bleiben darf.

Das Programm soll folgende Aufgabe haben:

1. Seiten zusammenfassen --> hab ich über eine einfache .bat gelöst
2. Neu entstandenes file Zeilenweise auslesen --> hab ich versucht in C++ zu lösen, sollte auch so en
3. Ab Zeile 20 alle Zeilen löschen die nicht mit R oder H beginnen --> und hier finde ich leiden keinen Anfang

Wenn mir jemand mit ein paar Ideen oder Anregungen helfen könnte wäre ich echt dankbar.

Grüße an alle. :)
 
Hier ein Beispiel:
Vorausgesetzt, der zusammengesetzte Text ist in der Datei "alt.txt":
---------------------------------------------------------------------------------------------------------------------
#include<stdio.h>
#include<string.h>

void main()
{
char c[1024],d;
FILE *f1,*f2;
f1=fopen("alt.txt","r");f2=fopen("neu.txt","w");
for(d=0;d<20;d++)
{fgets(c,1024,f1);fputs(c,f2);}
d=1;
while(d)
{
fgets(c,1024,f1);
if(c[strlen(c)-1]==-1){d=0;c[strlen(c)-1]='\0';}
if(c[0]=='R'||c[0]=='H')fputs(c,f2);
}
fclose(f1);fclose(f2);
}
-
Sollte funktionieren, sonst, schreib halt, was nicht passt.
 
Hi.

@sheel: Da sind ein paar Fehler in deinem Programm. Erstens muss der Rückgabetyp der main-Funktion int sein. Und wie kommst du darauf, das -1 in dem String c steht? Dann gehst du sehr optimistisch vor und prüfst nicht auf Eingabe/Ausgabefehler.

Hier mal mein Vorschlag:
C++:
#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main() {
  ifstream in("alt.txt");
  ofstream out("neu.txt");

  string line;
  int nr = 0;

  if (in.is_open() && out.is_open()) {
    while(getline(in, line)) {
      if (++nr < 20 || (line[0] == 'R' || line[0] == 'H') {
        if (! out << line) {
          cerr << "Konnte nicht in Datei schreiben." << endl;
        
          return 1;
        }
      }
    }
  } else {
    cerr << "Konnte Dateien nicht öffnen." << endl;

    return 2;
  }
}
Gruß
 
Warum int?
Kommt vielleicht auf den kompiler an,
bei VC gehts jedenfalls mit void.
Und dass mit -1 als datei-end-markierung ist schon in ordnung so,
bei nicht-binärdateien gehts immer.
Sonst prüft man es halt mit feof(...)
 
Weil der C Standard bzw. der C++ Standard das so vorschreibt.
Kommt vielleicht auf den kompiler an,
bei VC gehts jedenfalls mit void.
Das bedeutet nicht das es richtig ist.
Und dass mit -1 als datei-end-markierung ist schon in ordnung so,
bei nicht-binärdateien gehts immer.
Wer sagt das? Wo steht das? Laut C Standard wird der Buffer nicht geändert bzw. der Inhalt ist unbestimmt. Dein Code hängt also von undefinierten Verhalten ab.
If end-of-file occurs before any characters are read, they
return NULL and the buffer contents remain unchanged. If an error
occurs, they return NULL and the buffer contents are indeterminate.

Sonst prüft man es halt mit feof(...)
Und was ist dann bei einem Fehler?! Man sollte einfach den Rückgabewert prüfen ob er NULL ist.

Gruß
 
Hallo ihr Zwei, erst mal vielen, vielen Dank für eure Mithilfe!!
Hab die beiden Progrämchen am Wochenende mal durchgetestet.

@sheel: Deins funktioniert bis Zeile 270 Wunderbar, dann bleibt die gewandelte .exe aber stehen, und es passiert nix weiter, das Programm bleibt stehen und arbeitet mit 50% Systemauslastung vor sich her ohne weiteres Ergebnis. Muss ich da nen Wert noch höher setzten, oder woran kann das liegen?

@deepthroat: Deins bringt mir beim wandeln schon 10 Warnungen, da ich wie gesagt noch in den c - Anfängen stecke, kann ich damit nicht soviel Anfangen.

Grüße und Dank Euch nochmal Thomas
 
Hi.
@deepthroat: Deins bringt mir beim wandeln schon 10 Warnungen, da ich wie gesagt noch in den c - Anfängen stecke, kann ich damit nicht soviel Anfangen.
Ja, vielleicht hätte ich es ausprobieren (oder sorgsamer schreiben) sollen :-( - da fehlen ein paar Klammern:
C++:
#include <iostream>
#include <string>
#include <fstream>
       
using namespace std;
       
int main() {
  ifstream in("alt.txt");
  ofstream out("neu.txt");
       
  string line;
  int nr = 0;
       
  if (in.is_open() && out.is_open()) {
    while(getline(in, line)) {
      if (++nr < 20 || (line[0] == 'R' || line[0] == 'H')) {
	if (! (out << line << endl)) {
	  cerr << "Konnte nicht in Datei schreiben." << endl;
             
	  return 1;
	}
      }
    }
  } else {
    cerr << "Konnte Dateien nicht öffnen." << endl;
       
    return 2;
  }
}
Gruß
 
Zeile 270 hat nix besonderes, aber er bleibt jedesmal dort hängen.
Denk mal da der String ne länger von 1024 hat und ich mit meinem txt-file drüber war, so genau kann ich das aber auch nicht sagen.

Das andere Script funktioniert einwandfrei. Vielen Dank Euch Zwei nochmal für die tatkräftige Unterstützung. War echt super. :)
 
Zurück