Stringzeile mit ..."0"... einfügen

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
TerraG
Beiträge: 81
Registriert: 13. Oktober 2011 15:23

Stringzeile mit ..."0"... einfügen

Beitrag von TerraG »

Hi,

habe eine Methode, die mir über die Klasse "fstream" eine Datei erstellt, in die ich dann Text einfüge. Sieht etwa so aus (Inhalt der Methode):

Code: Alles auswählen

 std::fstream Datei;

 Datei.open("DateiEins", std::ios_base::out | std::ios_base::trunc);

 Datei << ... "Wert  "0"; \n" ... ;          // Hier ist das Problemchen!

 Datei.close();
Problem ist, der String nach "Datei <<" lässt sich so nicht einfügen, da die 0 schon umklammert ist. Der Text (die Zeile ist nur ein Miniteil davon) muss aber unbedingt nach diesem Schema in der Datei stehen, da ein anderes Programm ein bestimmtes Leseschema hat und das nur so lesen wird.

Wie krieg ich das hin, dass ich die 0 umklammert in den Text bringe, denn so bekomme ich bisher für die betrachtete Zeile die Fehlermeldung:

Code: Alles auswählen

Form.cpp:140:21: Fehler: expected »;« before numeric constant
?
Gruß
TerraG
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: Stringzeile mit ..."0"... einfügen

Beitrag von brax »

Das Stichwort hier lautet "Escapesequenz". Die Escapesequenz für " lautet \". "\n" ist übrigens auch eine Escapesequenz.... Der String muss also so aussehen: "Wert \"0\"; \n".

Nebenfrage: Warum benutzt Du nicht die Qt API für Deine Dateioperationen?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Stringzeile mit ..."0"... einfügen

Beitrag von franzf »

Das mit dem escapen hatte ich aber hier schonmal erwähnt. ("Der Kern des Problems...")
TerraG
Beiträge: 81
Registriert: 13. Oktober 2011 15:23

Re: Stringzeile mit ..."0"... einfügen

Beitrag von TerraG »

@brax: Ist \ dann soetwas wie eine Zeichenauswahl, d.h. ich wähle das Zeichen hinter dem \ in den String (folglich geeignet für Sonderzeichen)? --> Hat auf jeden Fall funktioniert!

Die Klasse "fstream" habe ich verwendet, da ich im Verlauf eines Tutoriums darauf gestoßen bin. Ich habe es auch mit QFile & QTextStream hingekriegt und zwar mit

Code: Alles auswählen

QFile file("out.txt");
         if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
             return;

         QTextStream out(&file);
         out << "The magic number is: " << 49 << "\n";
Habe aber mit der Dokumentation einige Probleme:
1. Warum soll ich zwei Klassen "QFile" und "QTextStream" verwenden, wenn es auch mit nur "fstream" geht?
2. Frage zu Grundlagen: Was bedeutet genau der Befehl: if (!file.open) = wenn ("Nicht"file.öffnen) ? (Ich weiss, dass sind C++ Grundlagen - versteh ich aber net ganz - würd es aber gern wissen :D).
3. Wo steht bitte in QFile, dass die Methode open eine Datei erzeugt?
4. Was soll das mit Methode close() aus QFile schließt die Datei nicht, löscht aber deren Inhalt? Auch wenn ich das hier garnicht anwenden müsste.
5. Bei "fstream" brauch ich garkeinen Zeiger zu benutzen (siehe &file in obriger Methode), sondern schreib einfach direkt in das fstream Objekt. Ist doch weniger umständlich oder?



@franzf:

Weiss nicht genau worauf Du hinaus willst, aber
1. In dem Thread ging es doch darum das doppelte Hochkomma zu entfernen, was nicht mein Ziel war.
2. Den Quelltext kann ich nicht ganz posten, weil ich mich u.U. damit strafbar mache und das muss ja nicht sein.


Noch ein weiteres Problem mit den Strings habe ich:

Eine weitere Codezeile des Textstrings

Code: Alles auswählen

"// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //"
gibt mir immer die Warnung:

Code: Alles auswählen

Form.cpp:189:9: Warnung: unbekannte Fluchtsequenz: '\040' [standardmäßig aktiviert]
Form.cpp:189:9: Warnung: unbekannte Fluchtsequenz: '\*' [standardmäßig aktiviert]
Könnt Ihr mir sagen wie ich die Warnung abstelle?
Gruß
TerraG
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: Stringzeile mit ..."0"... einfügen

Beitrag von brax »

TerraG hat geschrieben:@brax: Ist \ dann soetwas wie eine Zeichenauswahl, d.h. ich wähle das Zeichen hinter dem \ in den String (folglich geeignet für Sonderzeichen)? --> Hat auf jeden Fall funktioniert!
Escapesequenzen sind Zeichenfolgen, die innerhalb eines Strings eine besondere Bedeutung haben. Z.B. weist die Escapesequenz \n an, einen Zeilenumbruch zu machen. Zeichen, die in C++ eine besondere Bedeutung haben (z.B. "), haben ihre eigene Escapesequenz, um zwischen der besonderen Bedeutung und dem Zeichenwert zu unterscheiden. Google (bzw. Wikipedia) geben Dir unter dem Stichwort Escapesequenz noch einige andere an...
Habe aber mit der Dokumentation einige Probleme:
1. Warum soll ich zwei Klassen "QFile" und "QTextStream" verwenden, wenn es auch mit nur "fstream" geht?
2. Frage zu Grundlagen: Was bedeutet genau der Befehl: if (!file.open) = wenn ("Nicht"file.öffnen) ? (Ich weiss, dass sind C++ Grundlagen - versteh ich aber net ganz - würd es aber gern wissen :D).
3. Wo steht bitte in QFile, dass die Methode open eine Datei erzeugt?
4. Was soll das mit Methode close() aus QFile schließt die Datei nicht, löscht aber deren Inhalt? Auch wenn ich das hier garnicht anwenden müsste.
5. Bei "fstream" brauch ich garkeinen Zeiger zu benutzen (siehe &file in obriger Methode), sondern schreib einfach direkt in das fstream Objekt. Ist doch weniger umständlich oder?
An fstream ist erstmal nichts auszusetzen, war nur Interesse.
1. Es geht auch ohne QTextStream (QFile::write). QTextStream macht es nur komfortabler.
2. QFile::open gibt den als bool zurück, ob das Öffnen funktioniert hat. Die Zeile bedeutet also, "wenn Du die Datei nicht öffnen kannst, mach bitte nicht weiter" (die Datei kann z.B. nicht geöffnet werden, wenn Du versuchst eine schreibgeschützte Datei mit QIODevice::WriteOnly zu öffnen).
3. Aus der Doku zu QFile::open : "Note: In WriteOnly or ReadWrite mode, if the relevant file does not already exist, this function will try to create a new file before opening it."
4. Keine Ahnung was Du meinst. Doku: "Calls QFile::flush() and closes the file. Errors from flush are ignored." 1. Die Datei wird geschlossen. 2. nichts wird gelöscht, nur Fehler, die evtl. bei flush() auftreten werden ignoriert.
5. QTextStream bietet einige nette Funktionen, die man mit fstream selber machen muss, wenn man sie möchte (formatierte Ausgabe mit fester Feldbreite z.B.) außerdem kannst Du mit QTextStream in alle QIODevices schreiben (z.B. QProcess, QAbstractSocket, QNetworkReply).
@franzf:

Weiss nicht genau worauf Du hinaus willst, aber
1. In dem Thread ging es doch darum das doppelte Hochkomma zu entfernen, was nicht mein Ziel war.
franzf hat geschrieben: Der Kern des Problems ist nämlich, dass eine " in zwei "" escaped werden muss, denn QString(""") gibt dir nen Fehler...
Franzf wollte darauf hinaus, dass auch in dem Thread (auch wenn Dein Anliegen ein anderes war) der Kern des Problems beim escapen lag.

Code: Alles auswählen

"// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //"
gibt mir immer die Warnung:

Code: Alles auswählen

Form.cpp:189:9: Warnung: unbekannte Fluchtsequenz: '\040' [standardmäßig aktiviert]
Form.cpp:189:9: Warnung: unbekannte Fluchtsequenz: '\*' [standardmäßig aktiviert]
Könnt Ihr mir sagen wie ich die Warnung abstelle?
1. Dein Compiler gibt blöderweise deutsche Fehlermeldungen. "Blöderweise", weil Du so z.B. nicht das Schlüsselwort "escapesequence" angezeigt bekommst, sondern die seltsame deutsche Übersetzung "Fluchtsequenz". Das macht eine Fehlersuche per Google relativ schwer.
2. Irgendwie passt der gepostete Code und die Fehlermeldung nicht zusammen. Laut der Fehlermeldung hast Du da eher sowas wie

Code: Alles auswählen

"\* * * * * * * * * * * *\"
zu stehen. Auch hier ist das Problem das mit den Escapesequenzen.

Ganz nebenbei: Mir wäre das warten auf eine Antwort bei so grundlegenden Fragen ehrlich gesagt zu blöd. Eine Google Suche nach "c++ anführungszeichen in string" gibt Dir sofort die Lösung....
TerraG
Beiträge: 81
Registriert: 13. Oktober 2011 15:23

Re: Stringzeile mit ..."0"... einfügen

Beitrag von TerraG »

Hi, erstmal danke für die Hilfe.

Hab leider schon ein neues Problemchen. Habe jetzt doch die Textdatei mit QFile und QStream erstellt, da wie brax sagte dies besser mit QProcess funktioniert bzw. diese Klassen besser aufeinander abgestimmt sind xD.

Jetzt zu meinem Problem:

Der Quelltext, mit dem ich die Stringdatei schreiben möchte, sieht etwa so aus:

Code: Alles auswählen

.
.
.
         QTextStream out(&UaDatei);
         out <<                                                                                   // Schreibe in Objekt Ua
        "/*--------------------------------*- C++ -*----------------------------------*\ \n"   // \n für Zeilenumbrüche (ES)
        "| =========                 |                                                 | \n"
        "| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           | \n"
        "|  \\    /   O peration     | Version:  siehe OpenFoam                        | \n"
        "|   \\  /    A nd           | Web:      www.OpenFOAM.com                      | \n"
        "|    \\/     M anipulation  |                                                 | \n"
        "\*---------------------------------------------------------------------------*/ \n"        //PROBLEME AB HIER
        "FoamFile \n"
        "{ \n"
        "version     2.0; \n"
        "format      ascii; \n"
        "class       volVectorField;"
        "location  \"0\"; \n"
        "object      U; \n"
     "} \n\n"
.
.
.
Das Ganze ist soweit kein Geheimnis, kann ich also schreiben. Die Zeile ab der ich Probleme bekomme habe ich im Code benannt.
1.Problem: Das erste Backslash in der Zeile wird nicht geschrieben.
2.Problem: der Text, der in die Datei geschrieben wird endet einfach mit genannter Problemzeile.

--> Mit der "fstream" Klasse passierte mir das nicht. Ich denke die beiden Fehler 1. und 2. sind eventuell irgendwie miteinander verknüpft, weiss aber nicht wie ich die weg kriege. Einer ne Ahnung?
Gruß
TerraG
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Stringzeile mit ..."0"... einfügen

Beitrag von franzf »

Bitte google doch einfach mal nach "Escape-Sequenz", der erste Treffer ist der Wikipedia-Artikel - mit vielen Beispielen zu C-C++.
brax hat so viel geschrieben, auch dazu (ganz am Schluss). Lies es dir bitte wenigstens durch, und versuch das zu verstehen. Es wirkt wirklich so, als würdest du nur die Texte überfliegen, auf der Suche nach der Lösung :(
Ein wenig Nachdenken wäre wirklich angebracht, z.B.:
"\ leitet also Escape-Sequenzen ein. Kann ich denn dann wirklich einfach \ in nen String reinpacken, oder wird dann das vielleicht als Escape-Sequenz interpretiert?"
-> Versuch mal, die Frage für dich zu beantworten, dann schau dir die Wikipedia (oder sonstige) Beispiele an -> da steht dann schon die Lösung.
TerraG
Beiträge: 81
Registriert: 13. Oktober 2011 15:23

Re: Stringzeile mit ..."0"... einfügen

Beitrag von TerraG »

Hi,

also ich hab mir das in Wikipedia schon angeschaut http://de.wikipedia.org/wiki/Escape-Sequenz . Ist ja nicht so, dass ich zehn Minuten später geantwortet hätte.

U.a. habe ich für den Backslash diese EscapeSequenz \\ genommen, was auch funktioniert. Jedoch wird nach der Problemzeile immer noch der Text abgebrochen, was ich mir nicht erklären kann. Ich bekomme seitdem ich die Backslashes mit \\ eingefügt habe nicht mal mehr Warnungen vom Compiler, der Text wird trotzdem nicht ganz geschrieben. SIeht jetzt folgendermaßen aus:

Code: Alles auswählen

.
.
.
QTextStream out(&UaDatei);
         out << "/*--------------------------------*- C++ -*----------------------------------*\\ \n"
                "|  =========                |                                                 | \n"
                "|  \\\\      /  F ield        | OpenFOAM: The Open Source CFD Toolbox           | \n"
                "|   \\\\    /   O peration    | Version:  siehe OpenFoam                        | \n"
                "|    \\\\  /    A nd          | Web:      www.OpenFOAM.com                      | \n"
                "|     \\\\/     M anipulation |                                                 | \n"
                "\\*---------------------------------------------------------------------------*/ \n" //Problemzeile

        "FoamFile \n"
        "{ \n"
        "version     2.0; \n"
        "format      ascii; \n"
        "class       volVectorField;"
        "location  \"0\"; \n"
        "object      U; \n"
     "} \n\n"

     "// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // \n\n"
.
.
.

Vielleichts gibts ja etwas was einem Neuling wie mir nicht auffällt, deswegen stell ichs mal rein.
Gruß
TerraG
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Stringzeile mit ..."0"... einfügen

Beitrag von franzf »

Ich seh da keine Probleme, bei mir klappt das auch.
Bist du dir sicher, dass da nicht noch irgendwelche komischen Zeichen kommen? Kannst du mal die Leerzeile löschen, am besten gleich alle Leerzeichen samt neue Zeile?
TerraG
Beiträge: 81
Registriert: 13. Oktober 2011 15:23

Re: Stringzeile mit ..."0"... einfügen

Beitrag von TerraG »

Die Leerzeilen hab ich mal alle weg gemacht - hat aber nix gebracht.

Hier nochmal der ganze String (Ist eh immer nach Schema F):

Code: Alles auswählen

QTextStream out(&UaDatei);
         out << UaWert << "/*--------------------------------*- C++ -*----------------------------------*\\ \n"
                          "|  =========                |                                                 | \n"
                          "|  \\\\      /  F ield        | OpenFOAM: The Open Source CFD Toolbox           | \n"
                          "|   \\\\    /   O peration    | Version:  siehe OpenFoam                        | \n"
                          "|    \\\\  /    A nd          | Web:      www.OpenFOAM.com                      | \n"
                          "|     \\\\/     M anipulation |                                                 | \n"
                          "\\*---------------------------------------------------------------------------*/ \n"
        "FoamFile \n"
        "{ \n"
        "version     2.0; \n"
        "format      ascii; \n"
        "class       volVectorField;"
        "location  \"0\"; \n"
        "object      U; \n"
     "} \n\n"
     "// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // \n\n"
     "dimensions      [0 1 -1 0 0 0 0]; \n\n"
     "internalField   uniform (0 0 0); \n\n"
     "boundaryField \n"
    "{ \n"
        "outer\n"
        "{\n"
            "   type            fixedValue; \n"
            "   value           uniform (0 0 0); \n"
        "} \n"
        "stator \n"
        "{ \n"
            "   type            fixedValue; \n"
            "   value           uniform (0 0 0); \n"
        "} \n"
        "mixershaft \n"
        "{ \n"
            "   type            fixedValue; \n"
            "   value           uniform (0 0 0); \n"
        "} \n"
        "mixerplates \n"
        "{ \n"
            "   type            fixedValue; \n"
            "   value           uniform (0 0 0); \n"
        "} \n\n"
        "statorplate \n"
        "{ \n"
            "   type            fixedValue; \n"
            "   value           uniform (0 0 0); \n"
        "} \n"
        "bottom \n"
        "{ \n"
            "   type            fixedNormalSlip; \n"
            "   fixedValue           uniform (0 0 0); \n"
        "} \n"
        "top \n"
        "{ \n"
            "   type            inletOutlet; \n"
            "   value 		uniform (0 0 0); \n"
            "   inletValue      uniform (0 0 0); \n"
        "} \n"
        "defaultFaces \n"
        "{ \n"
            "   type            empty; \n"
        "} \n"
        "} \n\n"
        "// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //";
Das ist der ganze String, Fehlermeldung oder Warnung bekomme ich aber keine.
Gruß
TerraG
almboa
Beiträge: 21
Registriert: 27. September 2009 11:52

Re: Stringzeile mit ..."0"... einfügen

Beitrag von almboa »

Wenn ich das oben

Code: Alles auswählen

QFile UaDatei("test.txt");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return;
vor Deine Ausgabe schreibe, steht genau das Folgende in der Datei:
(Ich hab nur das UaWert weggelassen, was ist das genau?)

Code: Alles auswählen

/*--------------------------------*- C++ -*----------------------------------*\ 
|  =========                |                                                 | 
|  \\      /  F ield        | OpenFOAM: The Open Source CFD Toolbox           | 
|   \\    /   O peration    | Version:  siehe OpenFoam                        | 
|    \\  /    A nd          | Web:      www.OpenFOAM.com                      | 
|     \\/     M anipulation |                                                 | 
\*---------------------------------------------------------------------------*/ 
FoamFile 
{ 
version     2.0; 
format      ascii; 
class       volVectorField;location  "0"; 
object      U; 
} 

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // 

dimensions      [0 1 -1 0 0 0 0]; 

internalField   uniform (0 0 0); 

boundaryField 
{ 
outer
{
   type            fixedValue; 
   value           uniform (0 0 0); 
} 
stator 
{ 
   type            fixedValue; 
   value           uniform (0 0 0); 
} 
mixershaft 
{ 
   type            fixedValue; 
   value           uniform (0 0 0); 
} 
mixerplates 
{ 
   type            fixedValue; 
   value           uniform (0 0 0); 
} 

statorplate 
{ 
   type            fixedValue; 
   value           uniform (0 0 0); 
} 
bottom 
{ 
   type            fixedNormalSlip; 
   fixedValue           uniform (0 0 0); 
} 
top 
{ 
   type            inletOutlet; 
   value       uniform (0 0 0); 
   inletValue      uniform (0 0 0); 
} 
defaultFaces 
{ 
   type            empty; 
} 
} 

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
TerraG
Beiträge: 81
Registriert: 13. Oktober 2011 15:23

Re: Stringzeile mit ..."0"... einfügen

Beitrag von TerraG »

Hi, dass UaWert ist eine double Variable (war nur zum Test eingefügt). Seltsam, also ich hab das ganze jetzt nochmal mit einer anderen Datei gemacht, weil ich ja mehrere Dateien mit unterschiedlichem Inhalt erstellen muss und bei der anderen Methode funktioniert es einwandfrei. Danke für Eure Unterstützung Männers :). Ich werd dann mal vergleichen was in den beiden Methoden irgendwie anders ist....


NACHTRAG: So, Problem ist gelöst. Hab in einer Zeile die Escapesequenz \n für den Zeilenumbruch vergessen gehabt, daran sollte es gelegen haben xD. :lol:

Zweiter NACHTRAG: Es geht wieder nicht xD und ich hab kein Plan wieso :twisted: .
Gruß
TerraG
almboa
Beiträge: 21
Registriert: 27. September 2009 11:52

Re: Stringzeile mit ..."0"... einfügen

Beitrag von almboa »

Ich auch nicht.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Stringzeile mit ..."0"... einfügen

Beitrag von franzf »

Vielleicht hast du mal mit komischem Encoding abgespeichert? Vielleicht liegt da irgendwo ein Zeichen, welches vom Editor nicht angezeigt, vom Compiler aber erkannt wird?
Ich würde einfach die komplette Datei neu schreiben, aufs encoding beim Speichern achten. Dann sollte es wieder gehen.
TerraG
Beiträge: 81
Registriert: 13. Oktober 2011 15:23

Re: Stringzeile mit ..."0"... einfügen

Beitrag von TerraG »

Werd ich probieren, wenn ich wieder Zeit habe. :)
Gruß
TerraG
Antworten