Avatar billede thjal Nybegynder
14. februar 2007 - 21:35 Der er 3 kommentarer og
1 løsning

ifstream i objekt får noget vrøvl i mit array

jeg har følgende kode i min .h fil (lidt forkortet - sig hvis jeg mangler noget der skal bruges):

#include <iostream>
#include <fstream>
#include <string>

const int MAX_LENGTH = 32767; // 65536;

using namespace std;

class CRecordReplay
{
public:
    CRecordReplay();
    ~CRecordReplay();
    void    GetNewLine(char* FileName, char* Time);
private:
    unsigned int uiPosition;
    CString CSRecordValue;
    ifstream inFile;
    char LineInMem[MAX_LENGTH];
    string ArrayOfValues[MAX_LENGTH];
    string sFileNameOld;
    string sFileNameOldChanged;
};

og følgende i min .cpp fil (også bare et udpluk)

void CRecordReplay::GetNewLine(char* FileName, char* Time)
{
    LineInMem[0] = NULL;
    string sTime = Time;   
    string sFileName = FileName;

    int iComp;
    iComp = sFileName.compare(sFileNameOld);
    sFileNameOld = sFileName;
    if (iComp != 0)
        Replace(sFileName,'\\','/'); //FileName har formatet "C:\xxx\zzz\yyy.csv"

    if(!inFile.is_open())
    {
        inFile.close();        //Making sure that an old file would be closed if it was open
        string filename_in = "Test";
        inFile.open(sFileName.c_str());
        if (!inFile)
        {
            CSRecordValue = filenotok; //const string
        }
    }
    else
    {
        inFile.getline(LineInMem, MAX_LENGTH);
        }
    }
}

i LineInMem får jeg noget "sludder" - jeg tror at det er et udefineret memory område... Det kan jeg se når jeg kører i debugger.
Filen indeholder på hver linie formatet HH:MM:SS,blabla1,blabla2,0,0,1,1,
hvor HH:MM:SS er et klokkeslet. Antalet af blablaer og tal er forskelligt fra fil til fil.
Grunden til at jeg ikke lukker filen er at jeg skal bruge den næste linie i rækken næste gang GetNewLine() bliver kaldt. Filen bliver lukket når objektet destrueres.

- er der nogen der kan forklare mig hvorfor det her ikke virker og hvad jeg skal gøre i stedet?
Avatar billede bertelbrander Novice
14. februar 2007 - 22:50 #1
Hvis ikke filen er åben når du kalder GetNewLine, læser du ikke noget ind i LineInMem.
Avatar billede segmose Nybegynder
15. februar 2007 - 09:25 #2
Der bliver jo checket på inFile.is_open(), men hvis den ikke er åben bliver der ikke læst noget ind i exemplet, jeg synes dog der er noget galt med paranteserne:

void CRecordReplay::GetNewLine(char* FileName, char* Time)
{ // 1
    if(!inFile.is_open())
    { // 2
        if (!inFile)
        { // 3
            CSRecordValue = filenotok; //const string
        } // 2
    } // 1
    else
    { // 2
        inFile.getline(LineInMem, MAX_LENGTH);
        } // 1 den her er sikkert i overskud.
    } // 0
} // -1


Hvis du skifter fil navn (sFileName) skulle du vel lukke den gamle inFile og åbne den nye først.

http://www.cplusplus.com/istream::getline nævner nogle fejlbit er nogle af dem sat for inFile efter læsning?
Avatar billede thjal Nybegynder
15. februar 2007 - 09:29 #3
Ahh det med parenteserne gik galt da jeg kopierede koden ind i mit indlæg (der er mere i objektet end det jeg skriver her, men det har ikke noget med denne fejl at gøre).
Jeg vil dog checke på fejlbitten og se hvad den siger - tak for det tip.
og så har du selvfølgelig ret i at jeg først skal lukke den gamle fil inden jeg åbner en ny...
Jeg ser hvad der sker.
Avatar billede thjal Nybegynder
19. februar 2007 - 17:35 #4
godt så! Nu har jeg strippet hele koden ned til et absolut minmum (se for neden) og nu kører funktionen selvfølgelig som den skal!

void CRecordReplay::GetNewLine(char* FileName, char* Time)
{
    LineInMem[0] = NULL;
    string sTime = Time;   
    string sFileName = FileName;

    Replace(sFileName,'\\','/');
    if(!inFile.is_open())
    {
        inFile.open(sFileName.c_str());
    }
    inFile.getline(LineInMem, MAX_LENGTH);
}

- så kan jeg jo altid ligge alt det andet skidt på som jeg ellers skal bruge :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester