J
so, lebe doch noch, habe aber ein neues prob.
habe immo an dateien:
main.cpp = hauptfunktion.
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace::std; // Namensraum std einbinden
#include "dateien.h" // <<<< Headerdatei hinzugefuegt
#include "auftrag.h" // <<<< Headerdatei hinzugefügt
int main() //Hauptfunktion (Nebenfunktion)
{
// <<< Definition der Streams hier, da sie in main() weiterverwendet werden
ifstream inFile; // Telegrammdatei öffnen
ofstream outFile; // Ausgabedatei öffnen bzw anlegen
ofstream failFile; // Fehlerdatei öffnen bzw anlegen
ifstream auftragFile; // Auftragsartendatei öffnen
if (!dateien(inFile, outFile, failFile, auftragFile))
{
cout << "Fehler beim Oeffnen der Dateien\nProgramm wird beendet!";
exit(1);
}
auftragsart();
do // Komplette Datei bearbeiten
{
string line; // Stringvariable Zeile
getline(inFile, line); // Zeile einlesen
string telekopf = line.substr (0, 28); // Substringvariable Telegrammkopf (Kanalnr. -> Auftragsart)
if (inFile.eof()) // Bei erreichen des Dateiendes Rest überspringen (!!!)
continue;
if( telekopf[0] >= '0' && telekopf[1] <= '7') // Prüfung ob Kanalnummer zwischen 0 und 7 liegt
{
outFile << telekopf << endl; // Extrahierte Daten in Ausgabedatei schreiben
if( line[28] == auftragsnr[0] && line[29] ==auftragsnr[1])
{
if ( auftragsname == '0')
{
failFile << "Für diese Auftragsart liegt keine Definition vor." << endl;
}
outFile << telekopf << auftragsname << endl;
}
//outFile << telekopf << endl; // Extrahierte Daten in Ausgabedatei schreiben
}
else
{
failFile << "Fehler! Falsche Kanalnummer." << line << endl; // Protokoll in Fehlerdatei schreiben
}
}
while (!inFile.eof());
inFile.close(); // Datei wieder schliessen
}
auftrag.cpp:
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace::std; // Namensraum std einbinden
#include "dateien.h" // <<<< hinzugefuegt
#include "auftrag.h"
int auftragsart(string& auftrag, string& auftragsnr, string& auftragsname) //Hauptfunktion
{
ifstream inFile; // Telegrammdatei öffnen
ofstream outFile; // Ausgabedatei öffnen bzw anlegen
ofstream failFile; // Fehlerdatei öffnen bzw anlegen
ifstream auftragFile; // Auftragsartendatei öffnen
if (!dateien(inFile, outFile, failFile, auftragFile))
{
cout << "Fehler beim Oeffnen der Dateien\nProgramm wird beendet!";
exit(1);
}
do // Komplette Datei bearbeiten
{
string auftrag; // Stringvariable Zeile
getline(auftragFile, auftrag); // Zeilen einlesen
string auftragsnr = auftrag.substr (0, 2); // Substringvariable Auftragsnummer
string auftragsname = auftrag.substr(7, auftrag.length() -1); // Substringvariable Auftragsname (bis Ende des Namens)
if(auftragFile.eof())
continue;
//cout << auftragsnr << endl;
}
while (!auftragFile.eof());
auftragFile.close(); // Datei wieder schliessen
return 0;
}
dateien.cpp:
#include <iostream>
#include <sstream>
#include <string>
using namespace::std; // Namensraum std einbinden
// <<<< wenn schon using namespace, dann hier definieren da
// <<<< Headerdatei die Streams verwendet
#include "dateien.h" // <<< eigene Header-Datei einbinden
const char * const pFILENAME1 = "H:\\My Documents\\BMR Diagnosetool\\EingangsTelegramme\\0308080841.BMS"; // Telegrammdatei
const char * const pFILENAME2 = "H:\\My Documents\\BMR Diagnosetool\\AusgangsTelegramme\\0308080841.txt"; // Ausgabedatei
const char * const pFILENAME3 = "H:\\My Documents\\BMR Diagnosetool\\Fehlerprotokoll\\0308080841FAIL.txt"; // Fehlerprotokolldateidatei
const char * const pFILENAME4 = "H:\\My Documents\\BMR Diagnosetool\\auftrag.txt"; //Auftragsartendatei
// <<< umbenannt nach dateien()
// <<< Es darf innerhalb eines C++ Programms nur
// <<< nur ein main() geben!!! main() ist der Einsprung
// <<< ins Programm.
bool dateien(ifstream& inFile, ofstream& outFile, ofstream& failFile, ifstream& auftragFile)
{
inFile.open(pFILENAME1);
if (!inFile) // Prüfen ob Datei vorhanden
{
cout << "Datei " << pFILENAME1 << " konnte nicht gefunden werden." << endl;
return false;
}
outFile.open(pFILENAME2);
if (!outFile) // Prüfen ob Datei vorhanden
{
cout << "Datei " << pFILENAME2 << "ist nicht vorhanden." << endl;
return false;
}
failFile.open(pFILENAME3);
if (!failFile) // Prüfen ob Datei vorhanden
{
cout << "Datei " << pFILENAME3 << "ist nicht vorhanden." << endl;
return false;
}
auftragFile.open(pFILENAME4);
if (!auftragFile) // Prüfen ob Datei vorhanden
{
cout << "Datei " << pFILENAME4 << "ist nicht vorhanden." << endl;
return false;
}
return true;
}
dateien.h:
#include <fstream>
bool dateien(ifstream& inFile, ofstream& outFile, ofstream& failFile, ifstream& auftragFile);
auftrag.h:
#include <string>
int auftragsart(string& auftrag, string& auftragsnr, string& auftragsname);
und zu guter letzt mein makefile:
# Liste der Source-Dateien
SOURCES = auftrag.cpp dateien.cpp main.cpp
# Name der ausfuehrbaren Datei
TARGET = main.exe
# ==== Ab hier sind in der Regel keine Anpassungen notwendig ===
# Source- und Object-Verzeichnis
SDIR = .
ODIR = .
.PHONY: all clean rebuild checkdir
# Suchpfad fuer .o Dateien auf Object-Verzeichnis
# Wird benoetigt, da Datei mit den Abhaengigkeiten (dfile) keine
# Pfade enthaelt
vpath %.o $(ODIR)
# Pfad fuer Konsolen-Befehle
# Konsolen-Befehle verwenden Backslash anstelle von Slash
# Wird fuer clean und checkdir benoetigt
CODIR = $(subst /,\,$(ODIR))
# Liste der Objects, wird aus Source-Files generiert
OBJS := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))
# Verzeichnis vor Source- und Objects stellen
ROBJ = $(addprefix $(ODIR)/,$(OBJS))
RSRC = $(addprefix $(SDIR)/,$(SOURCES))
# Compiler-Flags setzen
CXXFLAGS = -c -Wall -pedantic
# Im Debugfall Debug-Output erzeugen und Symbole aus TARGET nicht entfernen
# ansonsten Optimierung einschalten und Symbole aus TARGET entfernen
ifdef DEBUG
CXXFLAGS += -ggdb
STRIP=
else
CXXFLAGS += -O3
STRIP=strip $(ODIR)/$(TARGET)
endif
# Default-Ziel
all: checkdir depends $(ODIR)/$(TARGET)
# Abhaengigkeit des EXE-Datei und Regel
$(ODIR)/$(TARGET): $(OBJS)
g++ $(ROBJ) -o $@
$(STRIP)
# Regel wie .o aus .cpp erzeugt wird
%.o:%.cpp
g++ $(CXXFLAGS) $(SDIR)/$< -o $(ODIR)/$@
# Alles wieder aufraeumen
clean:
-@del $(CODIR)\*.o
-@del $(CODIR)\*.exe
-@del dfile
# Alles neu bauen
rebuild: clean all
# Pruefen ob Verzeichnis fuer .o-Dateien exisitiert
checkdir:
@if not exist $(CODIR) mkdir $(CODIR)
# Datei mit den Abhaenigkeiten cpp->h erzeugen
depends: $(SOURCES)
g++ -MM $(SOURCES) >dfile
# Datei mit den Abhaengigkeiten einbinden
-include dfile
ansich klappt das alles ja wunderbar, nur beim compilieren meckert er immer rum das in der main.cpp auftragsnr und auftragsname nicht definiert sind. ich habe echt null plan warum er das nicht vernünftig einbindet. wäre nett wenn ich dabei nochmal hilfe haben könnte.
thx schonma