Textdateien unter MFC C++ anständig schreiben OHNE Dateikonvertierung?



  • Morgens!!

    ich arbeite mit embedded VC++ und leider habe ich da das Problem, dass eine Textdatei gefüllt mit einem CString in PocketWord nur das erste Zeichen angezeigt bekomme. Lese ich diese Datei wieder in mein Programm ein so habe ich auch nur genau dieses Zeichen zur Verfügung.
    Lade ich mir jedoch diese Datei auf meinen Desktop so kann ich mir im Wordpad die Datei anzeigen lassen und das mit dem ursprünglichen Inhalt.
    Es scheint also als würde der PocketPc da eine Dateikonvertierung vornehmen.
    Wie kann ich diesen Mist umgehen.....????
    (Microsoft rulz....aber manchmal halt eben nicht :-()

    Gruss
    Günni



  • Ich habe zwar null plan davon, einer bei uns hier progt hier embedded aber den erstmal zu finden *g*. Da du mich ja mehr oder weniger gebeten hast versuche ich mal mein Glück.

    Erkläre mal genauer...
    das heisst du Schreibst sachen in eine Datei z.B.:

    [DATEI]
    Paul zieht der Katze am Schwanz.

    im Pocket sieht du das nur:

    [DATEI]
    P

    und das bei deinem Prog und bei Pocketword.

    und jetzt lädst du die Datei auf deinen Rechner und du siehst alles????? und das ist dann wirklich die selbe datei?????

    *winke*



  • genau richtig erkannt.....ziemlich komisch wuerd ich mal sagen

    muss was mit unterschiedlichen dateiformaten zu tun haben (als laie geraten)



  • 😕
    keine Ahnung hier gibs aber bestimmt welche die den Grund dafür kennen...

    sorry..
    *winke*
    Hellsgore



  • Schuss ins Blaue:
    Schreib vor dem String ein '\xfeff' in die Datei.



  • DENNOCH DANKE HELLSGORE

    habe nun
    CString Vor = "\xfeff"; //Fehlermeldung: 65279 to big for character
    CString Inhalt = Vor + "irgendwas";

    😕



  • muss es vielleicht folgendermassen lauten?? und was ist das dann fuer ein verzeichnis???

    "\\xfeff"



  • Das ist kein Verzeichnis. Das ist ein einzelnes Zeichen. Beachte die einfachen Anführungszeichen.



  • auch mit hochkommas gibt er diesen fehler raus!!

    liegt das vielleicht an embedded c++?



  • im netz stehen da so sachen mit # anstatt des \

    aber auch da mag der compiler nicht mit hochkommas



  • Sorry, mein Fehler.

    CString Vor = L'\xfeff'



  • schön...nu schneidet er mir aber hinten einiges ab!!

    lol

    und nu?



  • Wer ist "er"?
    Was wird abgeschnitten? In etwa die Hälfte?
    Zeig mal den Code fürs Einlesen.



  • dieses datei schreiben und auslesen funktioniert mit char[] einwandfrei ohne eine derartige konvertierung
    nur leider moechten wir gerne CString verwenden da es dort leichter ist zu addieren und sortieren

    vielleicht kann mir wer sagen wie man auf embedded anstaendig einen knapp 1000 zeichen grossen CString in ein char[] schreibt

    dann wuerden wir so die datei schreiben.....ach verdammt....dann kann ich wiederrum die datei nicht schreibschuetzen

    verdammter mist....langsam nervt es!! 👎

    alsomomentan siehts so aus: ⚠

    ich habe eine textdatei welche in etwa so aussieht:
    10002~Reiner Zufall~Gluecksstr. 3Albershausen

    diese zerlege ich momentan mit strtok in ihre einzelkomponenten

    danach schreibe ich sie in irgendwelche editfelder um sie dort zu veraendern und dann wieder zusammenzufuegen
    danach moechte ich sie gerne wieder in eine datei schreiben welche den gleichen namen hat wie die ausgelesene

    nun wird nach anwendung obiger tipps der datensatz beschnitten...und zwar nach genau 13 zeichen
    lade ich diese datei nun wieder rein so kommt nur was echt komisches raus

    ein y mit punkten drauf
    ein b mit einem Strich nach unten wie ein p also quasi b und p ueberlagert
    und eine 1

    also: yb1 in extrem komisch 🙂

    wer kann mir da weiterhelfen???????? brauche es echt dringend

    danke
    guenni



  • der code fuers einlesen:

    m_AnzahlAuftraege =i;
    for (i=0;i< m_AnzahlAuftraege;i++)
    {
    char str[1000];
    CString end;
    end.Format('%.i',i);
    CString dat = Dateien[i];
    dat ="Daten\\Neukunden\" +dat;// ÄNDERN

    CFile datei(dat, CFile::modeRead);
    datei.Read(str, sizeof(str));
    char delimiter1[] ="~";
    char *pointer1;
    pointer1 = strtok(str, delimiter1);
    int k=0;
    m_MatrixOffeneAnfragen[i][k] = pointer1;
    while(pointer1=strtok(NULL, delimiter1))
    {
    k++;
    m_MatrixOffeneAnfragen[i][k] = pointer1;
    }

    m_ControllList.AddString( m_MatrixOffeneAnfragen[i][0]+ " "+
    m_MatrixOffeneAnfragen[i][1] );
    j++;
    datei.Close();
    }
    UpdateData(false);



  • und noch der code zum auslesen:

    CString Vor = L'\xfeff';
    CString Inhalt = Vor + m_Anfrage_nr +"~"+ m_Anfrage_name +"~"
    + m_Anfrage_name1 +"~"+ m_Anfrage_name2 +"~"
    + m_Anfrage_str +"~"+ m_Anfrage_plz +"~"
    + m_Anfrage_ort +"~"+ m_Anfrage_verkaufer;

    unsigned int laenge=Inhalt.GetLength();
    // CString funzt nicht !!!
    // wchar_t str[1000];
    // wcscpy(str,Inhalt);
    CString Dateiname ="Daten\\Neukunden\" + m_MatrixOffeneAnfragen[m_zahl][0] +"KDneu.txt";
    CFile datei(Dateiname, CFile::modeCreate |CFile::modeWrite );
    datei.Write(Inhalt, laenge);
    ::SetFileAttributes(Dateiname, FILE_ATTRIBUTE_READONLY); //da war der Fehler
    DWORD dwError = GetLastError();

    datei.Close();
    UpdateData(false);
    }



  • der originale datensatz zum testen lautet:

    10024~Haus Sylvia~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

    in der datei steht dann: 10024~Haus Sylv

    und nach dem erneuten einlesen: yb1 (in komisch :D) wie oben beschrieben

    du bist unsere einzige hoffnung



  • Wenn du die Datei mit \xfeff am Anfang erstellst, kannst du sie dann mit PocketWord etc. lesen?

    Falls ja, musst du sie anders einlesen. Die Datei ist jetzt nicht mehr ANSI, sondern UNICODE. Du musst mit WCHAR arbeiten, nicht mit char, und mit wcstok statt strtok.

    Ach ja:
    datei.Write(Inhalt, laenge * sizeof(WCHAR));



  • das hoert sich recht gut an....jedoch ist die datei nicht komplett

    habe grad noch ueberarbeitet leider vergessen zu schneiden

    raus kommt 10024~Haus Sylv ⚠

    also geschnitten



  • In laenge steht die Anzahl der Zeichen, Write will die Anzahl der Bytes. Jedes Zeichen eines CString ist unter CE 2 Bytes groß, also:

    datei.Write(Inhalt, laenge * 2);


Log in to reply