[gslöst]ofstream ifstream nicht in QT?

Verschiedenes zu Qt
Antworten
mampfi
Beiträge: 42
Registriert: 4. Juni 2015 11:32

[gslöst]ofstream ifstream nicht in QT?

Beitrag 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?
mampfi
Beiträge: 42
Registriert: 4. Juni 2015 11:32

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

Beitrag 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;

}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

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

Beitrag von Christian81 »

Wenn ich schon QString benutze, dann auch QFile und QTextStream ...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

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

Beitrag 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 ...
softwaremaker
Beiträge: 149
Registriert: 1. April 2009 19:25

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

Beitrag 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?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

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

Beitrag 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 ...
mampfi
Beiträge: 42
Registriert: 4. Juni 2015 11:32

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

Beitrag 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).
mampfi
Beiträge: 42
Registriert: 4. Juni 2015 11:32

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

Beitrag 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;
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

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

Beitrag 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 ...
mampfi
Beiträge: 42
Registriert: 4. Juni 2015 11:32

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

Beitrag 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 ;-)
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

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

Beitrag 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 ...
Antworten