File schreiben, keine newline



  • Hi zusammen

    Hab wieder einmal eine Frage.

    Mein Problem ist, dass ich eine Funktion habe, die mir einen string zurückgibt. Diesen String will ich in ein normales text file schreiben. Jedoch schreibt es mir nur eine Zeile und hängt nichts weiter an. An was kann das liegen?

    Mein Code:

    #include "CDateTime.h"
    #include "CSerialPort.h"
    #include "CTransitObservator.h"
    #include <iostream>
    #include <fstream>
    #include <windows.h>
    #include <conio.h>
    
    #define BUFSIZE 8192
    //-----------------------------------------------------------------------------
    int main(int argc, char* argv[])
    
    {
    
    	CDateTime dateTime;
    	CTransitObserver transitObserver(&serialPort);
    	int comPort = 5;
    	int baudRate = 11200;
    	string userName;
    	string computerName;
    	double version = 1.0;	
    
    	//Create LogFile Names
    	string logFileTimeStamp = dateTime.DateTime();	
    	string errorLogFileName = "errorReport_" + logFileTimeStamp + ".txt";
    	string rawLogFileName	= "raw_"		 + logFileTimeStamp + ".csv";
    
    	//Create LogFiles
    	ofstream oStreamErrorLog, oStreamRawLog;
    	oStreamErrorLog.open(errorLogFileName.c_str(), fstream::ate);
    	oStreamRawLog.open(rawLogFileName.c_str(), fstream::ate);
    
    	oStreamRawLog << "\n\nDate:               " << "Time:             " << "Data Received:" << endl;
    
    	while(!kbhit())
    	{
    		string *receivedData				 = new string;
    		unsigned long *numberOfBytesReceived = new unsigned long;
    		//Starts Observing
    		transitObserver.Observe(receivedData, numberOfBytesReceived);
    
    		//Writes TimeStamp and the Received Data in the raw log File.
    		oStreamRawLog << "\n" <<dateTime.Date() << "          " << dateTime.Time() << "          "  << *receivedData << "\r\n"; //funktioniert genau beim 1. Mal
    
    		//Close Log Files
    		oStreamErrorLog.close();
    		oStreamRawLog.close();
    
    		//Delete Variables
    		delete receivedData;
    		delete numberOfBytesReceived;
    	}
    	return 0;
    }
    

  • Mod

    Ob du deine Datei da wohl geschlossen hast und nicht wieder öffnest?

    Kommetar zu dem Code: Oh Graus, wie schrecklich. Ich überabeite dies mal eben, bin gleich wieder da.



  • oStreamRawLog.close();
    

    Und was soll das denn

    string *receivedData                 = new string;
    unsigned long *numberOfBytesReceived = new unsigned long;
    


  • brotbernd schrieb:

    oStreamRawLog.close();
    

    Ja das war das Problem. Wie SeppJ geagt hat.

    brotbernd schrieb:

    Und was soll das denn

    string *receivedData                 = new string;
    unsigned long *numberOfBytesReceived = new unsigned long;
    

    Ich weiss nicht. Was stimmt denn daran nicht? 😃


  • Mod

    #include "CDateTime.h"
    #include "CSerialPort.h"
    #include "CTransitObservator.h"
    #include <iostream>
    #include <fstream>
    #include <windows.h> 
    //#include <conio.h>  // Wozu?
    
    const unsigned BUFSIZE=8192;
    //-----------------------------------------------------------------------------
    int main() // Wozu argc und argv?
    
    {
    
        CDateTime dateTime;
        CTransitObserver transitObserver(&serialPort);
        int comPort = 5;        // Konstanten? Falls ja, dann mach welche daraus
        int baudRate = 11200;
        string userName;
        string computerName;
        double version = 1.0;   
    
        //Create LogFiles
        ofstream oStreamErrorLog(errorLogFileName.c_str(), fstream::ate);
        ofstream oStreamRawLog(rawLogFileName.c_str(), fstream::ate);
    
        oStreamRawLog << "\n\nDate:               " << "Time:             " << "Data Received:" << endl;
    
        while(!kbhit())
        {
            string receivedData;
            unsigned long numberOfBytesReceived;
            //Starts Observing
            transitObserver.Observe(&receivedData, &numberOfBytesReceived);
            // Bist du sicher, dass Observe einen String* braucht? Das ist ist extrem ungewöhnlich. Selbst geschrieben?
    
            //Writes TimeStamp and the Received Data in the raw log File.
            oStreamRawLog << "\n" <<dateTime.Date() << "          " << dateTime.Time() << "          "  << *receivedData << "\r\n"; 
        }
    


  • TTS schrieb:

    Ich weiss nicht. Was stimmt denn daran nicht? 😃

    Erklärs mir. Löscht die transitObserver.Observe und erzeugt neu Instanzen oder wozu ist das gut. Wahrscheinlich für goarnix. von daher

    string receivedData;
    unsigned long numberOfBytesReceived = 0;
    //Starts Observing
    transitObserver.Observe(&receivedData, &numberOfBytesReceived);
    

    Noch schöner wäre, wenn die Methdoe enfach nur den string zurück gibt. numberOfBytesReceived ist halt result.size();.



  • SeppJ schrieb:

    //#include <conio.h>  // Wozu?
    

    Hierfür:

    while(!kbhit())
    {
    }
    

    SeppJ schrieb:

    int main() // Wozu argc und argv?
    

    Damit das Programm mit Parametern gestartet werden kann. z.B. -com 5 -baud 9600 ...

    SeppJ schrieb:

    int comPort = 5;        // Konstanten? Falls ja, dann mach welche daraus
    

    Momentan ja, heute Abend nicht mehr. Bis dann sollte der ComPort als Parameter gesetzt werden können.

    SeppJ schrieb:

    transitObserver.Observe(&receivedData, &numberOfBytesReceived);
    // Bist du sicher, dass Observe einen String* braucht? Das ist ist extrem ungewöhnlich. Selbst geschrieben?
    

    Ja die Funktion ist selbst geschrieben. Sie liesst Daten über den ComPort ein.

    Danke für deine Hilfe.



  • brotbernd schrieb:

    Erklärs mir. Löscht die transitObserver.Observe und erzeugt neu Instanzen oder wozu ist das gut. Wahrscheinlich für goarnix. von daher

    Nee. Oben wird Speicher für die beiden Variablen alloziert. Und am ende der Schleiffe mit delete wieder freigegeben.

    brotbernd schrieb:

    string receivedData;
    unsigned long numberOfBytesReceived = 0;
    //Starts Observing
    transitObserver.Observe(&receivedData, &numberOfBytesReceived);
    

    Noch schöner wäre, wenn die Methdoe enfach nur den string zurück gibt. numberOfBytesReceived ist halt result.size();.

    Danke auf das mit result.size() bin ich nicht gekommen. Aber das ist sowieso nur für Testzwecke später benötige ich die Anzahl empfangener Bytes nicht mehr.


  • Mod

    TTS schrieb:

    SeppJ schrieb:

    transitObserver.Observe(&receivedData, &numberOfBytesReceived);
    // Bist du sicher, dass Observe einen String* braucht? Das ist ist extrem ungewöhnlich. Selbst geschrieben?
    

    Ja die Funktion ist selbst geschrieben. Sie liesst Daten über den ComPort ein.

    Informier dich mal, was eine Referenz ist. Ganz wichtiges Thema.


Anmelden zum Antworten