Log cout

Status
Niet open voor verdere reacties.

bepetemish

Gebruiker
Lid geworden
18 sep 2007
Berichten
21
weer een vraag :D

Kan ik met "fstream" de "cout" van mijn programma naar een .txt bestand schrijven?
Ik heb een paar dingen geprobeerd maar ik sta telken voor volgende keuze:
a. tekst laten zien
b. tekst wegschrijven

Maar ik wil dit dus combineren.

Voorbeeldjes zijn zeer welkom.


achtergrond: ik ben bezig met een C++ console project. Het is een server. Berichten en waarschuwing worden weergeven met cout. Ik wil wanneer iemand het programma sluit (of wanneer de cout gaat) naar log.txt schrijven.
 
Laatst bewerkt:
Kun je niet gewoon iedere keer als je iets naar cout stuurt het meteen ook wegschrijven in dat bestand? Anders zou je alles in een buffer kunnen opslaan en voor het afsluiten weg laten schrijven maar dat lijkt me niet echt geweldig..
 
naar cout stuurt het meteen ook wegschrijven in dat bestand

Ja, dit lijkt mij ook het meest logische. Ik heb het even geprobeerd gisteren en kreeg het niet echt voor elkaar.

Zou je een voorbeeldje kunnen plaatsen om te laten zien hoe jij dit zou doen?
 
Code:
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    ofstream file("log.txt");
    
    cout << "Server says hi.\n";
    file << "Server says hi.\n";
    
    cout << "Server asks how you are.\n";
    file << "Server asks how you are.\n";
    
    cout << "Server says goodbye.\n";
    file << "Server says goodbye.\n";
    
    file.close();
    
    cin.get();
    
    return 0;
}
 
*bericht aangepast*

Ik was ongeveer even ver gekomen als jouw voorbeeld. Is het mogelijk om dit in 1 lijn te doen zodat ik niet telkens de teskt 2x hoef te typen?
 
Laatst bewerkt:
dan maak je er toch een functie van:

void doeIetsMetTekst(string blaat)
{
cout<<blaat;
file << "Server says hi.\n";
}

elke x als je dat wilt doen doe je gewoon

doeIetsMetTekst("hoi");
werkt anders ook wel...
 
Voor als je alles precies wat op het scherm verschijnt ook precies in je bestand wil hebben:
Code:
void doeIetsMetTekst(string blaat)
{
cout<<blaat;
file << blaat;
}
 
Ja ik heb em door.

Bedankt voor jullie hulp. Ik ga ermee aan de gang wanneer ik thuis ben. Moet wel lukken met deze information.

Grtz,

Bepetemish
 
Hmmm, tog niet :D
Ik heb logger.h:
Code:
void Text(string message, string kind)
{

ofstream file("log.txt");

if( kind == "normal" )
{
    cout << white << "<normal> " << message << endl;
    file << "<normal> " << message;
}

if( kind == "guide" )
{
    cout << blue << "<guide> " << message << endl;
    file << "<guide> " << message;
}

if( kind == "winsock" )
{
    cout << red << "<winsock> " << message << endl;
    file << "<winsock> " << message;
}

if( kind == "database" )
{
    cout << yellow << "<database> " << message << endl;
    file << "<database> " << message;
}

if( kind == "admin" )
{
    cout << green << "<admin> " << message << endl;
    file << "<admin> " << message;
}
file.close();
}

en in main.cpp zit:
Code:
    Text("Test1","normal");
    Text("Test2","guide");


Wanneer main.cpp heeft gedraaid en ik check log.txt zit alleen de laatste "message" erin. Ik ben nog niet op een oplossing gekomen. Ik ben zelf ook nog aan het zoeken maar als jullie de oplossing weten hoor ik het graag, zit er nu tog alweer ff mee te *****n..
 
Murdocki, dat geeft compile errors:

- `add' is not a member of `std::ios'


Ik denk dat ik het probleem weet. Elke keer als ik Text("","") doe maakt mijn programma een nieuwe log.txt aan inplaats van dat hij in de bestaande log.txt schrijft.
Ik ben nu aan het proberen om log.txt te openen voor ik er naar ga schrijven.
 
Laatst bewerkt:
Je kunt ook gewoon een soortgelijke functie als cout maken. Je doet dan gewoon iets als onderstaande:

Code:
#include <cstdlib>
#include <iostream>
#include <string>
#include <fstream>

class COut
{                 
      public:
             COut(){}
             ~COut(){}
             const COut operator<<(const std::string s){ 
                 std::ofstream  output("test.txt", std::ios::app);
                 output    << s << std::endl;
                 std::cout << s << std::endl;
                 output.close();
             }          
};

int main(int argc, char *argv[])
{
    COut output;
    output << "schrijf iets weg naar cout/bestand";
    output << "schrijf nog iets weg naar cout/bestand";
 
    system("PAUSE");
    return EXIT_SUCCESS;
}

edit: en als je wilt kiezen hoe het getoond moet worden kun je iets doen als dit:

Code:
class COut
{                 
      public:
             COut(){}
             ~COut(){}
             const COut operator<<(std::string s){ 
                 std::ofstream  output("test.txt", std::ios::app);

                 if(s.substr(0, strlen("database")) == "database")
                 {
                         s.erase(0, strlen("database") + 1 );              
                         std::cout <<"<database> " << s << std::endl;
                         output    << "<database> " +  s << std::endl;
                 }

                 output.close();
             }          
};

int main(int argc, char *argv[])
{
    COut output;
    output << "database database gevonden";
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
Laatst bewerkt:
Hmmm, tog niet :D
Ik heb logger.h:
Code:
void Text(string message, string kind)
{

ofstream file("log.txt");

if( kind == "normal" )
{
    cout << white << "<normal> " << message << endl;
    file << "<normal> " << message;
}

if( kind == "guide" )
{
    cout << blue << "<guide> " << message << endl;
    file << "<guide> " << message;
}

if( kind == "winsock" )
{
    cout << red << "<winsock> " << message << endl;
    file << "<winsock> " << message;
}

if( kind == "database" )
{
    cout << yellow << "<database> " << message << endl;
    file << "<database> " << message;
}

if( kind == "admin" )
{
    cout << green << "<admin> " << message << endl;
    file << "<admin> " << message;
}
file.close();
}

en in main.cpp zit:
Code:
    Text("Test1","normal");
    Text("Test2","guide");


Ik zou sowieso een andere methode zoeken. Als je nu wat extra functie's in Text() zou willen stoppen, moet je alles weer handmatig invoeren. ( if(kind == waarde) doe_iets)

Een andere manier die je hiervoor zou kunnen gebruiken is:
(je zult hem wel moeten aanpassen op jouw type's voor red, yellow, etc)

Code:
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <map>
using namespace std;

void Text(string zoeken, string bericht)
{
    ofstream output("log.txt", ios::app); 
    map<string, string> m;
    m.insert(make_pair("normal", "white"));
    m.insert(make_pair("guide", "blue"));     
    m.insert(make_pair("winsock", "red"));
    m.insert(make_pair("database", "yellow"));
    m.insert(make_pair("admin", "green"));
    
    map<string, string>::iterator p = m.find(zoeken);
    if(p != m.end())
    {
        cout << p->second << "<" << p->first << ">" << " " << bericht << endl;
        output << "<" << p->first << "> " << bericht << endl;
    }
    output.close();
}

int main(int argc, char *argv[])
{
    Text("normal", "normaal bericht");
    Text("guide", "guide bericht");
    Text("winsock", "winsock bericht");    
    Text("database", "database bericht");    
    Text("admin", "admin bericht");            
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan