Seite 1 von 1

[gslöst]ofstream ifstream nicht in QT?

Verfasst: 19. September 2015 21:23
von mampfi
Es gibt ja C++ bzw. fstream die Streams ifstream und ofstream, die der Library fstream enthalten sind.

Die Einbindung von fstream.h funktioniert in meinem QT-Programm problemlos.

Gibts ifstream und ofstream nicht mehr.


Und wenn ja ist fsteam eine "andere" fstream in qt?

Re: [gelöst]ofstream ifstream nicht in QT?

Verfasst: 20. September 2015 12:38
von mampfi
Hat sich erledigt (gleich noch ein Demo für Umwandlung QString in string):


Libs einbinden:

#include <fstream> //Für export und ostream, ifstream
using namespace std; //Für export und ostream, ifstream

------------------------------------------



void MainWindow::export_csv()

{
qDebug()<< "Hier ist export_csv" << "--";
QMessageBox::information(this, "Info", "export_csv");

ofstream textDatei("datei_schreiben.txt");

//QString nachname, vorname, telefon wurden aus Datenbank gelesen
if(textDatei)
{
textDatei << nachname.toStdString() << ";" << vorname.toStdString() << ";" << telefon.toStdString() << endl;
}
else
cout << "Dateifehler" << endl;

}

Re: [gslöst]ofstream ifstream nicht in QT?

Verfasst: 20. September 2015 17:41
von Christian81
Wenn ich schon QString benutze, dann auch QFile und QTextStream ...

Re: [gslöst]ofstream ifstream nicht in QT?

Verfasst: 21. September 2015 10:26
von RHBaum
Noch nen Tipp:

meide QString::toStdString

Die funktion ist praktisch, aber gibtn Template als returnvalue zurueck ...
Bei der geringsten Compilerunstimmigkeit kracht dir das Ding ...

Besser: in deinem Modul den std::string erzeugen lassen. zum convertieren kannst toLocal8bit hernehmen.

Code: Alles auswählen

std::string convert(const QString & value)
{
    QByteArray arrValue = value.toLocal8Bit();
    return arrValue.empty() ? std::string() : std::string(arrValue.constData(),arrValue.size());
}
Wenn sicherstellen kannst, das die QT Compilerversion und dein compiler 100% binaerkompatibel auch auf template generierten code sind, wirst keinen unterschied merken.
Aber wenn mal an den compilereinstellungen rumbaust, oder compilerversionen mixt, ist toStdString das erste was dir um die Ohren fliegt ...

Ansonsten hör auf Christian81 :-)

Ciao ...

Re: [gslöst]ofstream ifstream nicht in QT?

Verfasst: 21. September 2015 16:59
von softwaremaker
@RHBaum: Was meinst du mit Templates?
So siehts im Qt5-Code aus:

Code: Alles auswählen

inline std::string QString::toStdString() const
{ return toUtf8().toStdString(); }
QString::toUtf8 erzeugt ein QByteArray

Code: Alles auswählen

inline std::string QByteArray::toStdString() const
{ return std::string(constData(), length()); }
Somit kann er doch QString::toStdString problemlos nutzen?

Re: [gslöst]ofstream ifstream nicht in QT?

Verfasst: 22. September 2015 09:31
von RHBaum
Was meinst du mit Templates?
std::string ist nen template
und templates ueber dll grenzen ....

Im Qt5 Code siehts ned schlimm aus wegen dem "inline"
Wenn er (der Präprozessor) wirklich inlined, sollt es eigentlich auch funktionieren ....
Dann wird der code da erzeugt wo die funktion verwendet wird.

Bei meiner Umgebung(Visual Studio 2010-2015) kracht es genau bei den Funktionen ... sobald Qt runtime und App runtime nicht zu 100% zusammen passen.
Hier langts schon, wenn paar compilerflags ned zueinander passen. exception support, rtti, wchar_t typ .. etc.

umgehe ich das mit ner eigenen funktion, läuft ne qt5.4 gebaut mit vs 2012 und ne App gebaut mit vs 2013 zusammen (So wie es microsoft verspricht ^^)
release und debug ist an der stelle auch egal, ist trotzdem nachvollziehbar.

Eigentlich nen Indiz, das er das zeugs nicht inlined sondern symbole erzeugt .... und das nicht nur im debug.

mingw installationen kann ich nix zu sagen, keine ahnung obs da auch so ist ...

und unter linux durch den system compiler ist das problem eh nicht relevant

Aber vielleicht mach ich auch was falsch ...

Ciao ...

Re: [gslöst]ofstream ifstream nicht in QT?

Verfasst: 26. September 2015 11:27
von mampfi
Eigentlich wollte ich vor 2 Monaten nur rausfinden, wie man mittlerweile Masken baut.
Denn Turbo-Pascal unter MS-DOS ist leicht obsolet.
Zur Auswahl standen GTK+ und QT. Das lief dann so gut, dass ich gleich angefangen hab, die PHP-Adressverwaltung umzubauen.
-----------------------------------------------

Aktuelle Problemstellung:

Für den Export hab ich die Standard - C++ - Funktionen benutzt, falls Bibliotheken entstehen, mag ich die ehrlich gesagt nicht doppelt bauen.

Der Ausflug in die C++ - Bibliotheken war hier nur für die CSV- Exportfunktion.

Tja nun bin ich am Wackeln.
Gute Ratschläge sollte man annehmen.

Diese Funktion, die hier aufgelistet verwenden?

Doch zum reinen Glauben in der Art:

QFile file("out.txt");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return;
QTextStream out(&file);
out << "The magic number is: " << 49 << "\n";






Es könnte nämlich sein, dass ich das Programm mal unter Windows kompilieren möchte. (Dazu hier im Forum ein anderer Thread von mir).

Re: [gelöst]ofstream ifstream nicht in QT?

Verfasst: 27. September 2015 12:40
von mampfi
So die Exportfunktion wurde jetzt anständig auf QT-Methode umgeschrieben:

ofstream textDatei("adr.csv")

wurde ersetzt durch:

QFile file("adr.csv");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QMessageBox::information(this, "Info", "Fehler beim Öffnen der Datei");
return;
}
QTextStream textDatei(&file);


Die Exportdatei wird dann so geschrieben (Auschnitt):

QString Trenner = ";";

textDatei << firma << Trenner;
textDatei << nachname << Trenner;
textDatei << vorname << Trenner;
textDatei << telefon << Trenner;
textDatei << telefon_2 << Trenner;
textDatei << fax << Trenner;
textDatei << email << Trenner;
textDatei << email_2 << Trenner;
textDatei << website << Trenner;

Re: [gslöst]ofstream ifstream nicht in QT?

Verfasst: 28. September 2015 12:39
von RHBaum
Wenn Dir Qt genau das liefert, was Du brauchst, sprechen eigentlich nur handfeste Gründe dagegen es zu verwenden ^^

Ja Gründe dagegen gibt es auch, iss nur die Frage ob sie für Dich relevant sind ...

Ich entscheide mich gegebenen falls meist immer nur aus 2 Gründen gegen QT.

1. Abhaengigkeitsmanagement. Saubere Trennung GUI / Logic, und ich würde in der Logic Schicht Qt nur wegen dieser Funktionalitaet einführen .... Dann wären mir die Kosten (Versionsmanagement, Abhaengigkeit) zu hoch.
2. Ich fummel ziemlich tief und mit mehreren Threads rum. dann ist das impliziete Sharing bei Qt oft mehr nen Problem als Hilfe ...

Ciao ...

Re: [gslöst]ofstream ifstream nicht in QT?

Verfasst: 1. Oktober 2015 15:55
von mampfi
Der Hauptgrund war eigentlich, dass die Syntax in "Standard-C++" so einfach ist, dass sie mir auswendig besser eingeht als die von QT.

Ich meine das Öffnen von Dateien.

Mittlerweile ist die Routine aber nach der "reinen Lehre". Das Schreiben der Felder mit den ganzen Adressfeldern war Gott sei Dank identisch ;-)

Re: [gslöst]ofstream ifstream nicht in QT?

Verfasst: 2. Oktober 2015 10:15
von RHBaum
Der Hauptgrund war eigentlich, dass die Syntax in "Standard-C++" so einfach ist, dass sie mir auswendig besser eingeht als die von QT.
DIe Frage ist was meinst mit "Standard-C++" ? :-)
Ich empfinde es eher andersrum ....
die Qt syntax ist einfach/simple wenn man mal die richtigen Klassen und auch deren "richtigen" Einsatz Zweck kennt.
generisches C++, also templates mit der STL und Boost und anderen libs, find ich noch immer ... aehm ... weniger intuitiv, ich muss da trotzdem immer noch oft nachschauen.
Trotzdem mag ich auch lieber Boost und STL, nicht weil ich mich gern selbst geisele, sondern weil sie auch Vorteile haben auf Gebieten wo C++ seine hauptsächlichste Daseinsberechtigung hat.

Ciao ...