Seite 1 von 1
QTextStream >> QString --> nicht bei \n stoppen ?
Verfasst: 1. März 2007 22:59
von -=Freaky=-
hi,
ich lese in einem programm einzelne , von whitespaces getrennte strings aus einer datei per QTextStream ein (ts >> str;).
nun möchte ich aber, dass bei zeilenumbrüchen das einlesen nicht abgebrochen wird, also als trenn-phrase alle whitespaces, aber keine zeilenumbrüche haben, sodass, wenn ich z.B. in einer datei stehen habe
, nach
Code: Alles auswählen
QTextStream ts( &datei );
QString str;
ts >> str;
ts >> str;
ts >> str;
"app\nCONFIG" in der variable str steht.
ich habe in der qt4-doku dazu nichts gefunden, google habe ich ebenfalls versucht zu bemühen, genauso die boardsuche, aber nichts gefunden, weil ich das richtige zauberwort nicht kenne...
danke im voraus für eure antworten!
mfg,
julian
Re: QTextStream >> QString --> nicht bei \n stoppen
Verfasst: 2. März 2007 01:03
von patrik08
-=Freaky=- hat geschrieben:hi,
ich habe in der qt4-doku dazu nichts gefunden, google habe ich ebenfalls versucht zu bemühen, genauso die boardsuche, aber nichts gefunden, weil ich
mfg,
julian
Koentest du etwas genauer sein wass soll erreicht werden ? der ganze text splitten wie csv
http://de.wikipedia.org/wiki/CSV-Datei ... dafuer gibt es bessere wege....
Verfasst: 2. März 2007 14:35
von -=Freaky=-
also, wenn ich per QTextStream einen string aus einer datei lese ...
... , dann wird immer bis zum nächsten whitespace gelesen. unter die definition von "whitespace" fallen hier offensichtlich auch zeilenumbrüche. ich möchte aber, das NUR bei ' ' (leerzeichen) oder '\t' aufgehört wird, weiterzulesen. ein zeilenumbruch ('\n') soll einfach mitgelesen werden, und es soll trotzdem bis zum nächsten leerzeichen/tab eingelesen werden.
muss ich dazu isSpace() reimplementieren, sodass bei zeilenumbrüchen false zurückgegeben wird?
oh mann, das ist blöd zu erklären, aber vielleicht versteht ja irgendjemand, was ich will.
mfg,
julian
Verfasst: 3. März 2007 00:20
von patrik08
-=Freaky=- hat geschrieben:also, wenn ich per QTextStream einen string aus einer datei lese .
oh mann, das ist blöd zu erklären, aber vielleicht versteht ja irgendjemand, was ich will.
mfg,
julian
Ich sehe kein Ziel was du gerne erreichen willst.... und somit kann ich es nicht begreifen.... wie du das file lesen willst...
Willst du ein neues format entwickeln????
wenn ich zeile fuer zeile splitten will .... lese ich das file etwa so.....
lese & schreiben...
Code: Alles auswählen
/* read the contenet of a local file as qstring */
QString fopenutf8(QString fullFileName)
{
QString inside = "";
QFile file(fullFileName);
if (file.exists()) {
if (file.open(QFile::ReadOnly | QFile::Text)) {
inside = QString::fromUtf8(file.readAll());
file.close();
}
}
return inside;
}
/* write a file to utf-8 format */
bool fwriteutf8(QString fullFileName,QString xml)
{
if (fullFileName.contains("/", Qt::CaseInsensitive)) {
QString dirfromfile = fullFileName.left(fullFileName.lastIndexOf("/"))+"/";
QDir dira(dirfromfile);
if ( dira.mkpath(dirfromfile) ) { } else {
return false;
}
}
QTextCodec *codecx;
codecx = QTextCodec::codecForMib(106);
QFile f( fullFileName );
if ( f.open( QFile::WriteOnly | QFile::Text ) )
{
QTextStream sw( &f );
sw.setCodec(codecx);
sw << xml;
f.close();
return true;
}
return false;
}
dann splitte ich die zeile.....
QStringList allezeile = fopenutf8("filex.xx").split("\n");
if (allezeile.size() > 0) {
for .....
und einzelne zeile nochmals aufteilen wie man moechte....
}
Klahr gibt es noch komplizierte methode ... aber warum ?? wenn es einfach auch geht....
http://doc.trolltech.com/4.2/qstringlist.html
Verfasst: 3. März 2007 09:33
von Christian81
Verfasst: 3. März 2007 10:37
von -=Freaky=-
danke euch beiden, aber ihr habt das falsch verstanden.
bei
liest er alle zeichen aus der datei ein und schreibt sie in str. allerdings wird nur eingelesen, solange das aktuelle (gerade gelesene) zeichen kein whitespace oder zeilenumbruch ist (also solange QChar.isSpace() == false).
ich möchte nun aber solange aus der datei lesen, bis das aktuelle zeichen ein whitespace ist. zeilenumbrüche sollen KEIN "trennzeichen" sein, NUR leerzeichen und tabs.
mit der standart-lib ginge das so
Code: Alles auswählen
ifstream datei("datei.txt");
getline( datei, str, datei.widen(';') );
nur dass statt ';' ' ' (leerzeichen) UND '\t' da stehen müssten.
mfg,
julian
Verfasst: 3. März 2007 10:43
von Christian81
Alles in ein QByteArray/QString lesen und dann splitten wie man es möchte.
Verfasst: 3. März 2007 11:46
von -=Freaky=-
also gibt es dafür keine andere möglichkeit (ausser ne klasse von QChar abzuleiten, isSpace() zu reimplementieren, und dann nen QTextStream-ersatz zu schreiben, der diese alternative QChar-klasse nutzt) ?
na dann,
trotzdem nochmal vielen dank und sorry für die schlechte beschreibung des problems.
mfg,
julian
Verfasst: 5. März 2007 20:36
von patrik08
-=Freaky=- hat geschrieben:
Code: Alles auswählen
ifstream datei("datei.txt");
getline( datei, str, datei.widen(';') );
nur dass statt ';' ' ' (leerzeichen) UND '\t' da stehen müssten.
mfg,
julian
na also ..... !! sagt doch von anfang an dass du eine
http://de.wikipedia.org/wiki/CSV-Datei datei auslesen ... hatte mich gewundert ... wenn es ein neues format gibt denn ich nicht kenne...
Im buch von Jasmin Blanchette ist ein adress buch mit CSV .... und naturlich ein reader.... der separator /t muss du naturlich angeben.... es ist nicht ander als ein While mit QChar beim lesen .... jede QChar wird eizeln gelesen und beim separator zur naechte zelle und newline naechste line in der tabelle....
Verfasst: 5. März 2007 22:00
von -=Freaky=-
ich will kein csv-datei auslesen.
ich wollte einfach den zeilenumbruch aus der definition der whitespaces rausnehmen. das diente keinem besonderen nutzen, sondern einfach nur der besseren optik. (teile einer datei brauche ich, der rest wird eingelesen, gespeichert und später einfach genauso wieder in eine andere datei geschrieben, also unverändert übernommen. dabei ist es egal, ob statt den zeilenumbrüchen später leerzeichen da stehen, es sieht nur einfach besser aus und ist lesbarar.
ich habe das problem jetzt ganz anders gelöst.
Code: Alles auswählen
QStrin str;
ts >> str;
// irrelevanter code
else
{
QChar c;
qint64 pos = ts.pos();
while( !ts.atEnd() )
{
ts >> c;
if( c.isSpace() )
str += c;
else
break;
}
ts.seek( pos );
rest += str;
}
mfg,
julian