striker159
Lt. Junior Grade
- Registriert
- Dez. 2008
- Beiträge
- 330
ich möchte aus einer textdatei X datenzeichen einlesen. die letzen k-1 zeichen sollen gespeichert werden und beim nächsten funktionsaufruf an den anfang kopiert werden.
die datei hat folgendes format:
dazu benutze ich folgenden code:
folgendes problem:
meine testdatei ist
wenn ich nun getnext(10) aufrufe bekommen ich wie gewollt aaaaabbbbb zurück. der nächste aufruf getnext(13) sollte
bbbcccccddddd zurückgeben, landen allerdings in einer endlosschleife. laut konsolenausgabe wird brav immer 4 zeilen weiter gesprungen. keine ahnung warum er dann nicht weiterliest in der 5. zeile.
wenn ich beim ersten getnext aufruf nicht die komplette zeile lese( egal ob mehr oder weniger) funktioniert alles.
hat jemand eine idee woran es hängt?
die datei hat folgendes format:
Code:
daten
sinnloses zeugs
sinnloses zeugs
sinnloses zeugs
daten
sinnloses zeugs
sinnloses zeugs
sinnloses zeugs
...usw
dazu benutze ich folgenden code:
Code:
string Reader::getNext(int charCount, int* readCount){
if( !inputStream->is_open())
return "";
int toRead = charCount;
int lastReadCount = 0;
int k = 4;
char* buffer = new char[toRead+1];
memset(buffer,0,sizeof(char)*(toRead+1));
//copy leftover of last function call into buffer
memcpy(buffer, leftoverBuffer, sizeof(char) * leftoverCount);
toRead -= leftoverCount;
*readCount = leftoverCount;
cout << "start" << endl;
do{
// try to read
inputStream->get(buffer+*readCount, toRead+1, '\n');
lastReadCount = inputStream->gcount();
cout << "lastReadCount : " << lastReadCount << endl;
*readCount += lastReadCount;
cout << "readCount : " << *readCount << endl;
// set leftoverbuffer
for(int i = 0; i < k-1; i++){
leftoverBuffer[i] = buffer[*readCount - (k-1) +i];
}
leftoverCount = k-1;
// the stream did not read as many characters as needed. found either '\n' or eof
// if lastReadCount == 0 the previous read ended exactly before \n
if(lastReadCount == 0 || toRead != lastReadCount){
if(inputStream->eof()) break;
// set filepointer to next data line
cout << "next line" << endl;
for(int i = 0; i < 4; i++){
inputStream->ignore(numeric_limits<streamsize>::max(),'\n');
}
if(inputStream->eof()) break;
}
toRead -= lastReadCount;
cout << "toRead : " << toRead << endl;
}while(*readCount < charCount);
cout << "end" << endl;
string retVal = string(buffer);
delete [] buffer;
return retVal;
}
folgendes problem:
meine testdatei ist
Code:
aaaaabbbbb
sinnloses zeugs
sinnloses zeugs
sinnloses zeugs
cccccddddd
sinnloses zeugs
sinnloses zeugs
sinnloses zeugs
wenn ich nun getnext(10) aufrufe bekommen ich wie gewollt aaaaabbbbb zurück. der nächste aufruf getnext(13) sollte
bbbcccccddddd zurückgeben, landen allerdings in einer endlosschleife. laut konsolenausgabe wird brav immer 4 zeilen weiter gesprungen. keine ahnung warum er dann nicht weiterliest in der 5. zeile.
wenn ich beim ersten getnext aufruf nicht die komplette zeile lese( egal ob mehr oder weniger) funktioniert alles.
hat jemand eine idee woran es hängt?