Textfile Phänomen



  • Hi zusammen

    Ich bin mir nicht sicher, ob das hier schon ins Unix-Forum gehört. Es geht um die C++ fstream-Klasse auf einem Embedded Unix Rechner.

    Mein CGI-Skript fwrap schreibt und liest Dateien in meinem Filesystem und wird über POST/GET Parameter gesteuert. Die betreffende File sieht in etwa so aus:

    administrator:ad97210f51130101665e72c2d9498a3a
    norbert:3095dbfcb9273218857172b1e75e7cd5
    othmar:ad97210f51130101665e72c2d9498a3a
    teddy:57c2877c1d84c4b49f3289657deca65c

    Nun soll mein CGI-Skript einen Text anfügen:

    ofstream ofs;
       ofs.open(getPostParam(strQueryString, "strFile").c_str(), ios_base::app | ios_base::binary);
       ofs << getPostParam(strQueryString, "strData");
       ofs.close();
    

    Öffne ich die Datei mit WinSCP, ist alles perfekt (habe z.B. einen neuen User "pascal" angelegt:

    administrator:ad97210f51130101665e72c2d9498a3a
    norbert:3095dbfcb9273218857172b1e75e7cd5
    othmar:ad97210f51130101665e72c2d9498a3a
    teddy:57c2877c1d84c4b49f3289657deca65c
    pascal:57c2877c1d84c4b49f3289657deca65c

    Liest aber mein CGI-Skript die Datei mit folgenden paar Codezeilen aus:

    ifstream ifs;
       ifs.open(getPostParam(strQueryString, "strFile").c_str(), ios_base::in | ios_base::binary);
       string strIn;
       while (ifs.good())
       {
          getline(ifs, strIn, '\n');
          cout << strIn << '\n';
       }
       ifs.close();
    

    So zeigt mein Browser das hier an:

    administrator:ad97210f51130101665e72c2d9498a3a
    norbert:3095dbfcb9273218857172b1e75e7cd5
    othmar:ad97210f51130101665e72c2d9498a3a
    teddy:57c2877c1d84c4b49f3289657deca65c0

    Besonder die zusätzliche '0' am Ende des Hashwertes ist mir verdächtig. (ios_base::binary habe ich übrigens testeshalber hinzugefügt, ohne habe ich genau denselben Effekt)

    Öffne ich die Datei mit WinSCP (wo sie ja, wie gesagt, korrekt angezeigt wird), füge ein Leerzeichen an, lösche dieses wieder und speichere die Datei mit WinSCP, so wird die Datei nun auch von meinem CGI Skript und im Browser korrekt angezeigt (mitsamt dem neuen Eintrag).

    Ich gehe also davon aus, dass ich beim Schreiben etwas falsch mache. Nur was?

    Danke für eure Hilfe und beste Grüsse
    Kessi



  • std::ifstream input_stream(getPostParam(strQueryString, "strFile").c_str(), std::ios::in | std::ios::binary);
    
    /*if (!input_stream)
        return false;*/
    
    std::string string_line;
    while (std::getline(input_stream, string_line))
        std::cout << string_line << std::endl;
    

    ... wobei mir nicht ganz ersichtlich ist, warum du binär ließt ... aber einen std::string rausholst ...

    Edit
    Unnötigen Teil als Kommentar markiert.



  • Okay, das macht den Code schon einmal einen Zacken eleganter :), thx!

    Mein Problem löst das allerdings noch nicht. Einträge, die über mein Programm geschrieben wurden, werden wiederum von meinem Programm immer noch nicht angezeigt. Mit dem WinSCP Editor hingegen ist der Eintrag drinnen - genau dort und genau so wie er sein soll.

    Die zusätzliche 0 fehlt nun beim Auslesen übers CGI - der letzte, übers CGI gemachte Eintrag aber leider auch 😞 .



  • (D)Evil schrieb:

    ... wobei mir nicht ganz ersichtlich ist, warum du binär ließt ... aber einen std::string rausholst ...

    Wie gesagt, war nur zum Testen. Ein Versuch aus purer Verzweiflung, könnte man sagen 😉 .

    Habe aber mit oder ohne binary exakt denselben Effekt / dasselbe Problem...



  • KessiMC schrieb:

    Mein Problem löst das allerdings noch nicht. Einträge, die über mein Programm geschrieben wurden, werden wiederum von meinem Programm immer noch nicht angezeigt. Mit dem WinSCP Editor hingegen ist der Eintrag drinnen - genau dort und genau so wie er sein soll.

    Dann zeig doch mal, wie du die Zeile hinzufügst 🙂



  • Etwa so 🙂 :

    KessiMC schrieb:

    Hi zusammen
    Nun soll mein CGI-Skript einen Text anfügen:

    ofstream ofs;
       ofs.open(getPostParam(strQueryString, "strFile").c_str(), ios_base::app | ios_base::binary);
       ofs << getPostParam(strQueryString, "strData");
       ofs.close();
    

    Bzw. seit (D)Evils Tip so:

    ofstream ofs(getPostParam(strQueryString, "strFile").c_str(), ios_base::app);
       ofs << getPostParam(strQueryString, "strData");
       ofs.close();
    

    Ist eigentlich auch nicht so wichtig, in beiden Fällen wird der Text, den ich so über's CGI schreibe, beim erneuten Auslesen über's CGI nicht angezeigt. Öffne ich das File aber mit dem im WinSCP integrierten Editor, ist die neue Zeile da. Speichere ich das File dann mit WinSCP (indem ich z.B. einen Space hinzufüge und gleich wieder lösche), so zeigt auch mein CGI-Programm beim Auslesen alle Zeilen an.

    Ach ja, getPostParam liefert übrigens einen std::string zurück...

    Thx soweit und greeetz
    Kessi



  • Könnte das vielleicht an den Zeilenumbrüchen liegen? Gibt ja \r\n und \n, in Linux (glaubich) nur \n. Bin mir nicht sicher, aber ist es aufm Mac nur \r?
    Egal, öffne die Textdatei doch mal in einem Hex-Editor und guck dir die Zeilenumbrüche an. Nach 0x0A und 0x0D musst du Ausschau halten; guck mal wie die Datei aussieht, bei der das Einlesen fehlschlägt!



  • omfg genau das war's 🙂 .

    Ich habe den \r \n im Programm, das mein CGI-Programm aufruft durch einen \n ersetzt und alles läuft paletti 🙄 .

    Thx in alle Richtungen und beste greeetz
    Kessi


Anmelden zum Antworten