PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : QFile::getch: File not open



doitux
02-03-2006, 22:53
Hallo

Ich habe ein Problem mit der folgenden Funktion:


void qupilmainwindowimpl::refresh_frontList()
{
//search for pupils
QStringList subdirsTemp;
subdirsTemp = progDir->entryList();
subdirsTemp.remove(".");
subdirsTemp.remove("..");

QDir subDir;
QFile personaldataFile;
QString line;
QString completeName;

listView1->clear();

for ( QStringList::Iterator it = subdirsTemp.begin(); it != subdirsTemp.end(); ++it )
{
subDir.setPath(QDir::home().absPath()+"/.qupil/"+*it);
personaldataFile.setName(subDir.absPath()+"/personaldata.txt");

QListViewItem* item = new QListViewItem(listView1);

personaldataFile.open( IO_ReadOnly );
QTextStream readStream( &personaldataFile );
while ( !readStream.atEnd() ) {
line = readStream.readLine();
if ( line.startsWith("firstname")) {
completeName = line.section( "=", 1, 1 );
}
if ( line.startsWith("lastname")) {
completeName = line.section( "=", 1, 1 )+", "+completeName;
item->setText(0, completeName);
}
if ( line.startsWith("lessonday")) {
item->setText(1, line.section( "=", 1, 1 ));
}
if ( line.startsWith("lessontime")) {
item->setText(2, line.section( "=", 1, 1 ));
}
}
personaldataFile.close();
}
listView1->setAllColumnsShowFocus(TRUE);

}

Die Liste soll am Ende eine Auflistung der Schüler mit Name und Unterrichtszeit enthalten. Für jeden Schüler gibt es ein Unterverzeichnis mit dessen Namen. In diesem Unterverzeichnis befindet sich die date personaldata.txt aus der die Werte für die Liste gestreamt werden.

Bei Start des Programms wird die Funktion standardmäßig einmal ausgeführt. Das klappt auch wunderbar.

Wenn ich jedoch zuvor einen bestimmten Schüler (mit Unterverzeichnis) mit der Funktion del_pupil() gelöscht habe und am Ende der Funktion refresh_frontList() ausführen will bekomme ich immer:
QFile::getch: File not open
QFile::atEnd: File is not open
QFile::getch: File not open
QFile::atEnd: File is not open
QFile::getch: File not open
QFile::atEnd: File is not open
und das Programm hängt.

Wenn ich das Programm dann wieder neu starte wird die Funktion problemlos ausgeführt und der Schüler erscheint nicht mehr in der Liste.
Kann mir jemand sagen warum die Funktion refresh_frontList() am Ende von del_pupil() fehlschlägt?

Gruß
doitux

locus vivendi
03-03-2006, 09:33
Ich kann da keinen Fehler sehen, außer das du überprüfen solltest, ob der Aufruf von QFile::open erfolgreich war. Falls ein Fehler gemeldet wird, könntest du mit QFile::errorString und QFile::status vielleicht schon die näheren Umstände herausfinden.

doitux
03-03-2006, 09:47
Hallo.

Vielen Dank für den Tip.

Das war das Problem: progDir->entryList();
Ich hatte einen pointer auf progDir für sämtliche Funktionen. Als der Ordner gelöscht wurde war er zwar physisch weg aber über progDir->entryList(); war er bis zum Programm neustart immer noch zu sehen. Nun hab ich den Pointer rausgenommen und definiere progDir als normales QDir-Objekt bei jeder Funktion neu. Und damit gehts.

thx
doitux