C++ endlosschleife beim ifstream lesen

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:
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?
 
ich versteh zwar nicht ganz was du erreichen willst
aber versuche mal das ganze char* buffer usw. rauszuschmeissen
warum verwendest du nicht durchgängig inputstream >> mystring usw...

Soweit ich das sehe ´hast du dich verrant und machst es zu kompliziert (aber wie bereits gesagt, ich versteh die aufgabe nicht wirklich)
 
die "aufgabe" ist, dass ich aus einer datei, die so aufgebaut ist, wie im ersten post beschrieben, eine bestimmte anzahl X an datenzeichen lesen will. wenn bereits daten gelesen wurden, sollen die k-1 letzten zeichen, die durch den vorherigen funktionsaufruf gelesen wurden, am anfang der aktuellen rückgabe stehen. diese k-1 zeichen zählen bereits zu den X.

der wechsel zwischen den datenzeilen macht mir probleme. aber jetzt ist es spät, da muss ich morgen nochmal drübergucken.
 
Zuletzt bearbeitet:
Zurück
Oben