I have a Doubt with File Streams
-
I'm learning Qt reading a book, and I have installed Qt creator on Linux. This is my first example than probe in Qt.
I have this code Qt about file streams:@//#include <QCoreApplication>
#include <QTextStream>
#include <QString>
#include <QFile>QTextStream cout (stdout);
QTextStream cerr (stderr);int main() //(int argc, char *argv[])
{
// QCoreApplication a(argc, argv);QString str, newstr; QTextStream strbuf(&str); int lucky = 7; float pi = 3.14; double e = 2.71; cout << "An in-memory stream" << endl; strbuf << "pi : "<< pi << endl << "luckynumber: " << lucky<< endl << " e : " << e << endl; cout << str; QFile data("mydata"); data.open(QIODevice::WriteOnly); QTextStream out(&data); out << str ; data.close(); cout << "Read data from the file - watch for errors. " << endl; if (data.open(QIODevice::ReadOnly)) { QTextStream in(&data); float pi2; in >> newstr >> pi2;// *it seems Problem in this point- NOTE_1* if (pi2 != pi) cerr << "ERROR! wrong " << newstr << pi2 << endl; else cout << newstr << "OK" << endl; int lucky2; in >> newstr >> lucky2;
/* if (pi2 != pi)
cerr << "ERROR! Wrong " << newstr << pi2 << endl;
else*/
cout << newstr << lucky2 << endl;//" OK" << endl;double e2; in >> newstr >> e2; if (e2 != e) cerr << "ERROR! Wrong " << newstr << e2 << endl; else cout << newstr << " OK" << endl; data.close(); } cout << "Read from file line-by-line" << endl; if (data.open(QIODevice::ReadOnly)){ QTextStream in(&data); while (not in.atEnd()) { newstr = in.readLine(); cout << newstr << endl; } data.close(); } return 0;//a.exec();
}
@and when i save, compile and run, get it:
An in-memory stream
pi : 3.14
luckynumber : 7
e : 2.71
Read data from the file - watch from errors.
ERROR! wrong pi0
:3
ERROR! wrong .140
Read from file line-by-line
pi : 3.14
luckynumber : 7
e : 2.71
Press <RETURN> to close this window...NOTE_1: my question is: Why the value of pi can't be copied in pi2?
Thanks in advance
Lucho
-
this just can't work.
You write a single string to the file. But later you try to read a string and a float.writing:
@
QTextStream out(&data);
out << str ;
data.close();
@reading:
@
QTextStream in(&data);
float pi2;
in >> newstr >> pi2;
@And don't use QTextStream then, instead use QDataStream (since you obviously want to stream other types than text only).
-
From QTextStream doc:
bq. There are three general ways to use QTextStream when reading text files:
- Chunk by chunk, by calling readLine() or readAll().
- Word by word. QTextStream supports streaming into QStrings, QByteArrays and char* buffers. Words are delimited by space, and leading white space is automatically skipped.
- Character by character, by streaming into QChar or char types. This method is often used for convenient input handling when parsing files, independent of character encoding and end-of-line semantics. To skip white space, call skipWhiteSpace().
Which means that you should remove extra white spaces or serialize data somehow.