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]
Pund 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 sortierenvielleicht 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. 3Albershausendiese 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 ausgelesenenun 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 rausein y mit punkten drauf
ein b mit einem Strich nach unten wie ein p also quasi b und p ueberlagert
und eine 1also: 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;// ÄNDERNCFile 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);