Toon posts:

[C++] ofstream loopt vast?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Goeiemorgen allemaal,

Ik ben bezig in een applicatie waarin ik een log wil wegschrijven in een txt file. Nu loopt dit allemaal vrij goed, maar plots wil ie gewoon niet meer wegschrijven naar het bestand?

Als ik in debugging mode kijk, dan haalt ie weldegelijk de juiste data binnen (vanuit de CAN-bus, wat ik dus in mijn geval wil loggen) .. maar het wegschrijven gebeurd niet meer ..

ik denk dat het iets te maken heeft met de ofstream?
er wordt dus gebruik gemaakt van een thread die aan het running is met z'n oneindige while(1) lus ..

ik dacht eerst dat er een beperking van de ofstream is inzake het aantal keer de stream openen, aangezien het in de while(1) lus zit .. maar als ik dit extern declareer blijf hetzelfde probleem plaatsvinden :(

hier een stukje broncode:

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
25
26
        while(1){
            can_berichten_running = 1;
            canFlushReceiveQueue(handle);

            stat_msg1 = canReadSpecific(handle,id1,data_reeks1,&dlc,&flags,&timestamp);
            timestamp1 =canReadTimer(handle);
    
            // alle bewerkingen signaal 1
            if(stat_msg1 == 0 & schrijven_log & Form2->check_log1->State ){
                ofstream datalog1("datalog1.txt", ofstream::out | ofstream::app);
                if(!start1){
                    prev_timestamp1 = timestamp1;
                }
                                time_verschil1 = (timestamp1 - prev_timestamp1);
                prev_timestamp1 = timestamp1;
                timer1 += time_verschil1;
                datalog1 << timer1 << "|";

                if(Form2->type_1->Text == "char"){
                   dat.Xchar[0] = data_reeks1[startbyte1_0];
                   dat.Xchar[1] = 0;
                   dat.Xchar[2] = 0;
                   dat.Xchar[3] = 0;
                   datalog1 << dat.Xint << "\n"; // dat.Xint haal ik uit een union
                }
                           }


dit geeft als resultaat bv:

0|65
6|75
12|25
18|35
24|55
29|65
38|65
45|65
50|85
57|25
etc ..

maar na x-aantal seconden houdt deze het voor bekeken. Volgens het programma moet de waarde iedere keer worden weggeschreven .. maar dit is blijkbaar niet het geval :(

Alvast bedankt!
Alexander

  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02 21:38

TheNameless

Jazzballet is vet!

Als de ofstream destroyed wordt, dan wordt ook de handle naar het bestand vrijgegeven, dus maakt het niet uit hoe vaak je hem opent, in jou geval.

Voor de rest zie ik zo 1-2-3 niet wat er fout gaat. Meest logische reden lijkt mij dat je if statement false oplevert en er dus niets geprint word.

Deze dus:
C++:
1
if(stat_msg1 == 0 & schrijven_log & Form2->check_log1->State )

Waarvoor gebruik je in de if-statement eigenlijk de '&' operator en niet de '&&' operator?

Ducati: making mechanics out of riders since 1946


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat moet idd een && zijn.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Moest idd een && zijn ;-)

Na wat zoeken denk ik iets gevonden te hebben. Terwijl het programma aan het schrijven is naar het bestand is er ook nog een excel file die deze data inleest en iedere seconde een grafiek aan het tekenen is ..

kan het daar aan liggen dat excel iedere seconde het bestand inleest? terwijl ook constant nieuwe data ingeschreven wordt via mijn programma?

Bedankt!

Verwijderd

Voor zover ik weet is het niet toegestaan om op het moment dat een bestand al geopend is (op filesystem level) om te lezen, om dan ook een stream te openen naar datzelfde bestand welke mag schrijven.

Dus dat is zeer waarschijnlijk je probleem... :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat hangt er een beetje vanaf hoe je de file opent, maar standaard open ze idd meestal niet voor shared READ/WRITE. Volgens mij kan dat met een fstream ook niet en zul je OS-specifieke functies daarvoor aan moeten roepen.

Error checking op je datalog had natuurlijk ook wel netjes geweest :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
.oisyn schreef op vrijdag 01 december 2006 @ 11:43:
Dat hangt er een beetje vanaf hoe je de file opent, maar standaard open ze idd meestal niet voor shared READ/WRITE. Volgens mij kan dat met een fstream ook niet en zul je OS-specifieke functies daarvoor aan moeten roepen.

Error checking op je datalog had natuurlijk ook wel netjes geweest :)
en wat zijn die OS-specifiek functies dan juist ? :D

bedankt!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hoe kan ik die vraag nou beantwoorden als ik niet eens weet op welk OS je werkt? :)
.edit: ok, ik zie dat je excel noemt dus ik kan denk ik wel aannemen dat je Windows gebruikt ;). CreateFile() is een optie maar tedious, _fsopen is iets handiger. Als je echt de iostreams wilt blijven gebruiken kun je natuurlijk altijd nog een streambuf implementeren die naar een FILE* (_fsopen) of een HANDLE (CreateFile) schrijft

[ Voor 66% gewijzigd door .oisyn op 01-12-2006 12:27 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Volgens mij hoeft dat niet eens; die streambufs bestaan al (van Dinkumware, ik weet niet of MSVC ze al bevat)

[ Voor 5% gewijzigd door MSalters op 02-12-2006 01:18 ]

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • ATS
  • Registratie: September 2001
  • Laatst online: 28-11 20:56

ATS

Is het belangrijk dat je inderdaad files gebruikt? Ik bedoel: het lijkt uit je beschrijving dat je eigenlijk op zoek bent naar IPC tussen jouw programma en Excel... In dat geval zijn er natuurlijk nog veel meer opties dan het gebruiken (misbruiken?) van een file zoals je nu doet.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Verwijderd

Topicstarter
En welke mogelijkheden zouden er dan nog zijn,

Alvast bedankt!
Alexander

  • DroogKloot
  • Registratie: Februari 2001
  • Niet online

DroogKloot

depenisvanjezus

Wat dacht van je (named) pipes? :)

[ Voor 4% gewijzigd door DroogKloot op 05-12-2006 15:05 ]


  • ATS
  • Registratie: September 2001
  • Laatst online: 28-11 20:56

ATS

Netwerk sockets (dat lukt vast wel in Excel) zouden ook een optie kunnen zijn.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant

Pagina: 1