Textdateien unter MFC C++ anständig schreiben OHNE Dateikonvertierung?
-
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);
-
laenge *2
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHHHHHAAAAAAAAAAAA!!!!!!!!!
sowas muss einem ja auch mal gesagt werden
eh cool wir probieren weiter!!
melde mich gleich wieder
-
MFK du bist ein Held!!!
Schreiben funzt
ABER!!! mit dem erneuten Lesen klappts nicht so recht....
wenn Du unseren Code abaendern koenntest so dass wir mal vergleichen koennten waere das ein richtig goiler Zug von Dir
haben so manches WCHAR & WCSTOK probiert und kriegen einfach keine 0 Errors hin
er hat staendig Konvertierungsprobleme...
wie gesagt wir wollen Text mit max. 1000 Zeichen einlesen
VIELEN DANK
Guenni
-
axso "ER" ist der drecks Compiler
-
m_AnzahlAuftraege =i; for (i=0;i< m_AnzahlAuftraege;i++) { WCHAR str[1000]; //CString end; //end.Format(L"%.i",i); CString dat = Dateien[i]; dat = L"Daten\\Neukunden\\" +dat;// ÄNDERN CFile datei(dat, CFile::modeRead); datei.Read(str, sizeof(str)); WCHAR delimiter1[] =L"~"; WCHAR *pointer1; pointer1 = wcstok(str, delimiter1); int k=0; m_MatrixOffeneAnfragen[i][k] = pointer1; while(pointer1=wcstok(NULL, delimiter1)) { k++; m_MatrixOffeneAnfragen[i][k] = pointer1; } m_ControllList.AddString( m_MatrixOffeneAnfragen[i][0]+ L" "+ m_MatrixOffeneAnfragen[i][1] ); j++; datei.Close(); } UpdateData(false);
-
also bald hast du GOTTSTATUS
ABER!!! halt nur bald....
scheint zu funktionieren, jedoch laedt er nun unsere anfaenglich auf unserem server generierte textdatei etwas anders ein
die scheint ANSI zu sein und wir laden ja nun in UNICODE ein...nicht war?hilf uns und du bist GOTT !!
-
boah....wenn das uploaden auf den ppc nicht so lange dauern wuerde!!
irgendwie oeffnet er unsere nun in unicode abgespeicherte datei in der die namen der eigentlichen dateien stehen aber kann die anderen nicht oeffnen da er vor jeden namen einer datei noch einen "wuerfel" davor setzt
also dieses quadratische zeichenunsere dateien heissen eigentlich 10024KDneu.txt und er macht daraus []10024KDneu.txt
wobei die klammern nun dieses Quadtrat darstellen sollen!!!!
-
hier mal die methode wo es haengt!!
BOOL COffeneAnfragenAuftragswahl::OnInitDialog()
{
CDialog::OnInitDialog();int i=0,j=0,zahl=0;
WCHAR *Dateien[100];
WCHAR *pointer;
CString ExistDateien =L"Daten\\Neukunden\\ExistDateienNeu.txt";// Ändern
CFile ExDatei(ExistDateien,CFile::modeRead);
WCHAR token[1000];
WCHAR delimiter[] =L"~";
ExDatei.Read(token, sizeof(token));
pointer = wcstok(token, delimiter);Dateien[i] = pointer;
// m_Dateien[i] = Dateien[i];
while(pointer=wcstok(NULL, delimiter))
{
i++;
Dateien[i] = pointer;
// m_Dateien[i] = Dateien[i];
}
m_AnzahlAuftraege =i;
ExDatei.Close();
//CString test = Dateien[0];
//m_ControllList.AddString( test);im oberen teil wird unsere datei (ExistDateienNeu.txt) geoeffnet in der die eigentlich wichtigen Dateien aufgefuehrt sind
diese datei ist in unicode abgespeichert und vom inhalt korrektim unteren teil sollen die namen der dateien gebildet werden
danach werden diese aufgerufen und die einzelnen inhalte in eine matrix geschrieben um sie spaeter wunderbar aufrufen zu koennenLEIDER BILDET DAS PROGRAMM IMMER DIE FALSCHEN DATEINAMEN
(wie im vorigen Posting beschrieben)for (i=0;i< m_AnzahlAuftraege;i++)
{
WCHAR str[1000];
//CString end;
//end.Format('%.i',i);
CString dat =Dateien[i];
dat =L"Daten\\Neukunden\" +dat;// ÄNDERN
CFile datei(dat, CFile::modeRead);
datei.Read(str, sizeof(str));
WCHAR delimiter1[] =L"~";
WCHAR *pointer1;
pointer1 = wcstok(str, delimiter1);
int k=0;
m_MatrixOffeneAnfragen[i][k] = pointer1;
while(pointer1=wcstok(NULL, delimiter1))
{
k++;
m_MatrixOffeneAnfragen[i][k] = pointer1;
}m_ControllList.AddString( m_MatrixOffeneAnfragen[i][0]+L" "+ m_MatrixOffeneAnfragen[i][1]);
j++;
datei.Close();
}
UpdateData(false);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX-Eigenschaftenseiten sollten FALSE zurückgeben
}Hast Du vielleicht 1..2 Tipps wo man solche Dinge vernuenftig nachlesen kann?
Haben mehrere Buecher aber leider nicht fuer eMbedded.Ich kann gar nicht oft genug DANKE sagen....
Guenni
-
Der Fehler muss im oberen Bereich liegen, da wir direkt dahinter die ausgelesene Information auf dem Display versuchsweise ausgeben
UND DA KOMMT SCHON SCHROTT RAUS >> []10024KDneu.txt << !!!!!!
-
Servus,
hab das mal so halb mitverfolgt. Was mir nicht ersichtlich ist wo holt er sich denn den Dateinamen? Gib mir mal die Anweisung oder markiere sie in dem Quelltext und benutze bitte CodeTags (Das sind die kleinen Buttons unterhalb des Eingabe fensters. Einmal auf C++ geklickt, quelltext schreiben und danach nochmal draufklick) dann kann man das besser lesen.
Hellsgore
-
BOOL COffeneAnfragenAuftragswahl::OnInitDialog() { CDialog::OnInitDialog(); int i=0,j=0,zahl=0; WCHAR *Dateien[100]; WCHAR *pointer; CString ExistDateien =L"Daten\\Neukunden\\ExistDateienNeu.txt"; //////////////HIER STEHT DAS VERZEICHNIS DER DATEI IN WELCHER SICH DIE NAMEN DER ZU OEFFNENDEN DATEIEN LIEGEN///////////////////////// CFile ExDatei(ExistDateien,CFile::modeRead); WCHAR token[1000]; WCHAR delimiter[] =L"~"; ExDatei.Read(token, sizeof(token)); pointer = wcstok(token, delimiter); ////////////////HIER SCHREIBT ER DEN DATEINAMEN IN POINTER REIN //////////////////[cpp] Dateien[i] = pointer; // m_Dateien[i] = Dateien[i]; while(pointer=wcstok(NULL, delimiter)) { i++; Dateien[i] = pointer; // m_Dateien[i] = Dateien[i]; } m_AnzahlAuftraege =i; ExDatei.Close(); //CString test = Dateien[0]; //m_ControllList.AddString( test);
for (i=0;i< m_AnzahlAuftraege;i++)
{
WCHAR str[1000];
//CString end;
//end.Format('%.i',i);
CString dat =Dateien[i];
dat =L"Daten\\Neukunden\" +dat;// ÄNDERN
CFile datei(dat, CFile::modeRead);
datei.Read(str, sizeof(str));
WCHAR delimiter1[] =L"~";
WCHAR *pointer1;
pointer1 = wcstok(str, delimiter1);
int k=0;
m_MatrixOffeneAnfragen[i][k] = pointer1;
while(pointer1=wcstok(NULL, delimiter1))
{
k++;
m_MatrixOffeneAnfragen[i][k] = pointer1;
}m_ControllList.AddString( m_MatrixOffeneAnfragen[i][0]+L" "+ m_MatrixOffeneAnfragen[i][1]);
j++;
datei.Close();
}
UpdateData(false);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX-Eigenschaftenseiten sollten FALSE zurückgeben
}hoffe das ist verstaendlich
-
> ENTWARNUNG <<<<<<<<<<<<
Wir haben festgestellt, dass wir die Dateien weiterhin nach Oeffnen in char[] schreiben koennen, da nur ganz am Anfang 1 Quadrat zu viel ist und dieses bekaempfbar ist. :p
Dieses schneiden wir dann nach Umwandlung nach CString einfach weg und speichern dann die spaeter neu generierte Datei in UNICODE wieder ab.Das funzt!!!
DANKE an Hellsgore und insbesondere an MFK!!!!!!
Ohne Euch wuerden wir ganz schoen auf dem Schlauch stehen.Guenni