[c++] outStream kan niet overweg met variabele bestandsnamen

Pagina: 1
Acties:

  • mduijvendijk
  • Registratie: Oktober 2001
  • Laatst online: 11-05 14:22

mduijvendijk

Flying Rukia ^_^

Topicstarter
Ik heb een database met een aantal docenten.
Nu moet ik per docent een aantal gegevens op een html bestand zetten.
het probleem is echter dat er maar 1 html bestand wordt gegenereerd.
Dit bestand wordt iedere keer overschreven in de lus waardoor de laatste docent in het bestand van de eerste docent komt.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    string sdcInx;
    int aantalRijen;
    int i=1;
    strstream docentsrc;
    ofstream outStream;

    m_mysqlPrint.my_next_row();
    aantalRijen = m_mysqlPrint.my_num_rows();
    while (i<aantalRijen)
    {
        sdcInx = m_mysqlPrint.my_return_row()[6];
        docentsrc << "c:\\html\\" << sdcInx << ".html" << ends;
        outStream.open(docentsrc.str(), ios::out);
        ...
        code met ergens i++;
        ...
        outStream.close();
    };

Weet iemand wat er fout is aan de bovenstaande code?
p.s. even niet naar de while constructie kijken, er is een reden waarom ik geen for heb gebruikt, maar dat is niet relevant.

[ Voor 22% gewijzigd door mduijvendijk op 10-01-2004 14:37 ]

Sometimes human's are...


  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 13:10
wat geeft docentsrc.str() voor strings terug? kloppen die wel?

Verwijderd

Kun je es (een link naar) wat meer code geven, dat zou me wel helpen. De helft van wat ik lees is hier niet gedeclareerd zodat je het raden hebt naar het precieze datatype en verder zie ik ook niet wat je precies allemaal doet.

[edit]
Ik heb ff snel wat voorbeeldcode geschreven voor je, misschien dat je daar wat aan hebt. Voor de eenvoud heb ik alles hard coded geschreven, maar dat maakt niet uit natuurlijk. Gewoon 3 paren (naam van bestand, data die erin moet komen) aangemaakt en dan daar ff over itereren enzo, en iedere keer wordt een bestand met die naam gemaakt en de gewenste data erin geschreven. Echt heel basic dus.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <vector>
#include <fstream>
using namespace std;

int main()
{
    ofstream theHTMLfile;
    // array of pairs (filename, data)
    vector<pair<string, string> > theData;
    theData.push_back( pair<string, string>( string( "test1.html" ), string( "test1" ) ) );
    theData.push_back( pair<string, string>( string( "test2.html" ), string( "test2" ) ) );
    theData.push_back( pair<string, string>( string( "test3.html" ), string( "test3" ) ) );

    vector<pair<string, string> >::iterator theIterator( theData.begin() );
    while ( theIterator != theData.end() )
    {
        theHTMLfile.open( theIterator->first.c_str(), ios::out );
        theHTMLfile << theIterator->second << endl;
        theHTMLfile.close();
        ++theIterator;
    }
    
    return 0;
}

[ Voor 74% gewijzigd door Verwijderd op 10-01-2004 13:31 ]


  • mduijvendijk
  • Registratie: Oktober 2001
  • Laatst online: 11-05 14:22

mduijvendijk

Flying Rukia ^_^

Topicstarter
docentsrc.str() geeft c:\html\1000211.html
1000211 is gelijk aan de uitvoer van sdcInx van de eerste docent
Terwijl sdcInx 1000152 is (dit is de uitvoer van de laatste docent)

Om de een of andere reden wordt docentsrc niet opnieuw gevuld.

Sometimes human's are...


  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Als je de docentsrc na de loop laat weergeven dan maak je die variabele niet leeg voor de volgende file.

Verder is het wel makkelijk om de relevante code plus de initialisatie van de variabelen die relevant zijn te geven.

edit:
niet meer na het refreshen naar bij de TopicStart gekeken

[ Voor 17% gewijzigd door Shadowman op 10-01-2004 14:39 ]


Verwijderd

Ah, ik zie je probleem al. Maar laat ik gelijk enkele dingen zeggen. Om te beginnen wil ik graag opmerken dat strstream deprecated is, dus je kan beter stringstream gebruiken (maakt verder toch geen verschil). Een stringstream is eigenlijk niet veel meer dan een gewone iostream, en dat betekent dat je in jouw geval gewoon naar die stream blijft schrijven. Het is niet omdat je op het einde van die lus eens z'n huidige waarde opvraagt dat ie plots 'leeg' zou worden. Eigenlijk schrijf je iedere lus extra data weg. En de reden dat jij dat niet ziet is omdat je een 'ends' naar de stream stuurt (die gaat een null terminator character invoegen namelijk). Zet daar voor de grap maar es 'endl' ipv 'ends', je zal zien dat je string met je filenaam steeds maar langer wordt. Je denkt dus ten onrechte dat je string iedere keer c:\html\1000211.html is, maar geloof me, dat is niet zo. Tot zover de reden dat het niet werkt zoals je hoopt. Nu de oplossing :P Persoonlijk zorg ik er voor dat een stringstream in zo'n geval altijd een beperkte scope heeft. In jouw geval kun je die dus prima in je loop. Zo maak je iedere loop een nieuwe stringstream die nog geen data bevat en zal je progje werken :)

Je code wordt dan:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
string sdcInx;
int aantalRijen;
int i=1;
ofstream outStream;

m_mysqlPrint.my_next_row();
aantalRijen = m_mysqlPrint.my_num_rows();

while (i<aantalRijen)
{
    sdcInx = m_mysqlPrint.my_return_row()[6];
    
    strstream docentsrc;
    docentsrc << "c:\\html\\" << sdcInx << ".html";
    outStream.open(docentsrc.str(), ios::out);
    ...
    code met ergens i++;
    ...
    outStream.close();
};


Succes!

Oh, en mocht er toevallig iemand anders een handige methode weten om een stringstream 'te resetten' dan hoor ik het graag :)

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Heb ff gezocht naar de methode om de stringstream te resetten. Ik dacht eigenlijk dat alle std-classes een member hadden met de naam clear() die ervoor zorgt dat de class werd leeggemaakt maar bij stringstream werkt die niet.

Bij stringstream kun je str(""); gebruiken om het leeg te maken bv:
C++:
1
2
3
4
5
stringstream test;
test >> "test";
test.str("");
test >> "tset";
std::cout << test.str() << std::endl;

geeft als uitvoer:
code:
1
tset

  • mduijvendijk
  • Registratie: Oktober 2001
  • Laatst online: 11-05 14:22

mduijvendijk

Flying Rukia ^_^

Topicstarter
Ik heb het al opgelost in plaats van strstream gebuik ik gewoon een string ;)
code:
1
2
3
4
5
string docentsrc ;
...
docentsrc = "c:\\html\\" + sdcInx + ".html";
outStream.open(docentsrc.c_str(), ios::out);
...

Sometimes human's are...

Pagina: 1