Hallo!
Ich habe damit begonnen mich in C++ und Qt einzuarbeiten und kleinere Sachen klappen auch schon.
Ich habe jetzt versucht eine größere Textdatei einzulesen, was aber bei zeilenweisem Einlesen zu lange dauert. Weswegen wohl nur ein QTextStream in Frage kommt, indem man es in größere Blöcke aufteilt wird, dachte da an 32kb.
Dafür scheint QString QTextStream::read ( qint64 maxlen ) wohl ideal, oder?
Meine erste Frage ist nun, wie ich die Datei am schnellsten einlesen kann und auch wieder in ihre Einzelteile verpacke.
Es handelt sich dabei um eine Textdatei mit zeilenweisen Einträgen, eine Art Wörterbuch, und ist mit über 150.000 Einträgen (~2 MB) auch größer.
Die letzte Frage wäre dann auch, welchen Container ich für diese Einträge verwenden sollte. Die Datei wird nur einmalig beim Start eingelesen, aber der Inhalt des Containers soll erweitert, bzw. teilweise auch gelöscht werden, zudem finden häufige Vergleiche mit Einträgen statt.
Welcher Container ist dafür am besten geeignet?
Wäre über Hinweise dankbar.
Gruß,
Locutus
Zwei Fragen bezüglich Auslesen einer größeren Datei
Ich mache das ganze meist so:
Zur Containerfrage: Du kannst dir selbst einen Vektor schreiben! Aber auf Basis einer verketteten Liste... So funktioniert aber schon die QList von Qt. Dadurch ist es also wurscht welchen du nimmst^^
Du kannst auch eine Klasse basteln die auf Arrays beruht... Ich habe probiert dass ganze mit new und delete und umkopieren zu bewerkstelligen... Das ganze ist exponentiell langsamer im schreiben und umkopieren (wenn du die Größe vorher nicht kennst!!!) Aber dafür kannst du wahrscheinlich sehr schnell lesen und durchsuchen!!!
Was auf dich am wahrscheinlichsten zutrifft. das ganze tendiert je nach Funktionen zw. 200-700 Codezeilen und da du generell wenig umschreiben musst würde ich das empfehlen.
Am einfachsten ist die letzte Variante und dummerweise habe ich meine Vektorklasse schon gelöscht, sonst hätte ich sie hier rein gepackt.
Code: Alles auswählen
QStringList readConf(QString name, QString path)
{
QFile *file = new QFile(path + name);
QTextStream *txt_strm = new QTextStream(file);
QStringList str_lst;
if(file->open(QIODevice::ReadOnly))
std::cout<<"file opened"<<std::endl;
else std::cout<<"file not readable"<<std::endl;
if(file->isOpen() && file->isReadable() )
{
while(!txt_strm->atEnd())
{
QString line = txt_strm->readLine();
str_lst.append(line);
std::cout<<line.toStdString()<<std::endl;
}
}
return str_lst;
file->close();
}Du kannst auch eine Klasse basteln die auf Arrays beruht... Ich habe probiert dass ganze mit new und delete und umkopieren zu bewerkstelligen... Das ganze ist exponentiell langsamer im schreiben und umkopieren (wenn du die Größe vorher nicht kennst!!!) Aber dafür kannst du wahrscheinlich sehr schnell lesen und durchsuchen!!!
Was auf dich am wahrscheinlichsten zutrifft. das ganze tendiert je nach Funktionen zw. 200-700 Codezeilen und da du generell wenig umschreiben musst würde ich das empfehlen.
Am einfachsten ist die letzte Variante und dummerweise habe ich meine Vektorklasse schon gelöscht, sonst hätte ich sie hier rein gepackt.
-
Locutus