CFile bzw. CStdioFile lest falsche Daten ein
-
Hallo liebe Community,
ich lerne seit ca. einem Monat VC++ (MFC) (und ihr habt mich schön öfter aus der Patsche geholfen
), aber jetzt hab ich ein Problem, bei dem ich einfach nicht auf die Lösung draufkomme.Ziel ist, eine txt-Datei einzulesen, die Daten bearbeiten und wieder zurückschreiben.
die txt sieht etwa so aus:
0.900 0.900 5.00 5.00 0.850 0.850 4.70 4.70 0.82 0.82 4.50 4.50
etc etc.
ich versuchte mit
CStdioFile reader; CString buffer; CString filename = "c:\beispiel.txt"; if(reader.Open(filename, CFile::modeRead)) { while(reader.ReadString(buffer)) { // jede menge code } }aber auch mit
CFile reader; char test[256]; if(reader.Open(filename, CFile::modeRead)) { while(reader.Read(test, 256) > 0) { // wieder jede menge code } }die Daten einzulesen. Es wird auch etwas eingelesen, aber das schaut dann so aus:
1.00 1.00 0.10 0.10 1.00 1.00 1.00 1.00 etc.
In der Textdatei sind zwischen den Daten immer Tabstopps, aber das sollte normal nicht das Problem sein. Natürliche Zahlen (int), Text etc. wird richtig eingelesen. Ich verwende Visual Studio 2005.
Kann mir da jemand helfen? Würde mich über jeden Denkanstoss freuen

Vielen Dank und lg
-
Wenn du aus:
CString filename = "c:\beispiel.txt";
ein
CString filename = "c:\\beispiel.txt";
machst wird er auch die Datei öffnen können. Oder anders gesagt hättest Du mal mit dem Debuger geschaut hätte dir auffallen müssen, das er die Datei nicht öffnen kann. Oder is das beim Einkopieren in das Forum verloren gegangen?
Noch eine Sache warum ließt du die Datei mit while ein, wenn du eh einen CString benutzt und er so und so die gesammte Datei einließt, das könnte zu ungewünschten Effekten führen, ein if an der stelle sollte es auch tun.
Gruß Matthias
-
Versuche es mal mit
if(reader.Open(filename, CFile::typeText | CFile::modeRead))
-
CTecS: das ganze war nur das Gerüst, der Dateiname wird als Parameter übergeben und das passt auch. Wie bereits oben steht, werden andere Daten (keine floats, bzw. doubles) ordnungsgemäß eingelesen und somit auch die Datei richtig geöffnet. Hätte ich nicht mit dem Debugger geschaut, wüsste ich nicht, dass "1.00 1.00 0.10 0.10 1.00 1.00" usw. eingelesen wird
sri: Danke für den Tipp, aber da stürzt er beim Öffnen der Datei gleich ab *g*
-> Debug Assertion Failed!
filecore.cpp
line 140
-
Hmm, ich habe auch gerade ein Projekt, an dem das in Verbindung mit CStdioFile problemlos funktioniert.
Ups, sorry. Ich verwende das CFile::typeText im Konstruktor:
CStdioFile inlFile(szInlineFile, CFile::typeText | CFile::modeRead); while (inlFile.ReadString(strLine)) { // }
-
139: ASSERT(pException == NULL || AfxIsValidAddress(pException, sizeof(CFileException)))
140: ASSERT((nOpenFlags & typeText) == 0);
141: ASSERT(m_hFile == INVALID_HANDLE_VALUE);
spätestens hier steig ich komplett aus

-
selbes Problem...lest falsche Daten...
-
Also ich hab am Anfang auch probs mit dem Einlesen einer Textdatei gehabt. Habs aber hinbekommen.
Ich musste
File.Open(cDialog.GetPathName(), CFile::modeRead | CFile::typeBinary);nehmen, um die Datei gescheit auszulesen. Ohne typeBinary bekam ich nur müll raus
-
danke, aber das hab ich vorher auch schon probiert, nachdem sri das mit CFile::typeText gesagt hatte..
funktioniert auch nicht.nochmal das Problem: wenn in der txt-Datei eine float-zahl steht, wird die falsch eingelesen... aus 5.4 wird 1.0 oder 0.1
alles andere (es steht auch Text und Integers in der datei) wird richtig eingelesen...es is zum verzweifeln.... ich hab mich gerade nochmal versichert, dass ich keine falsche Datei einlese
-
CStdioFile reader; CString buffer; CString filename = "c:\beispiel.txt"; if(reader.Open(filename, CFile::modeRead)) { while(reader.ReadString(buffer)) { // jede menge code } }liest ja alles als CString ein. Werden denn die Daten im CString schon falsch eingelesen oder sind die da noch in ordnung? Nicht, dass etwas bei einer nachfolgenden Konvertierung verloren geht.
-
da kommen sie schon falsch an. aber auch wenn ich ein char [] hernehm
-
Kannst du evtl die Komplette Funktion mal Posten, damit man sich mal nen Bild machen kann? Weil eigentlich ist den CString egal ob da nen int, string oder float ist. Und wie kommen die Daten denn aus dem .txt-File? jeder Wert in einer neuen Zeile oder alles hintereinander?
-
int File_Open() { CStdioFile reader;// (filename, CFile::typeText | CFile::modeRead); CString buffer; //char buffer[256]; CString hlp; //float helper; int i = 0; //int gesamtlänge = 0; //DWORD buff; //char buffaa[256]; //LPTSTR lpszBuffer; if(reader.Open(m_ConfigFile, CFile::modeRead)) { while(reader.ReadString(buffer)) //.ReadString(buffer)) { if((i == 2) || (i == 1)) { } // unbrauchbare zeilen else { // Zerteilen des CString's und einfügen in die GUI WriteLineFlexGrid(buffer); } i++; } } /*CFile reader; CString buffer; char test[256]; if(reader.Open(filename, CFile::typeText | CFile::modeRead)) { while(reader.Read(test, 256) > 0) { } }*/ reader.Close(); return 1; }Eben das is ja so seltsam, weil in einen CString kann man ja alles reinpacken..
Die Daten kommen Zeilenweise daher und in einer Zeile stehen ca. 15 Werte, getrennt mit einem Tabstopp (genau wie im txt-File)..
-
also mit einer selbst geschiebenen txt-Datei (strings, int, fload mit tab getrennt) und mit deiner Funktion klappts bei mir. Ich trenn die daten allerdings nicht sondern schmeiß die in eine MSG-Box aus.
void Cproj_3Dlg::OnBnClickedButton1() { CFileDialog cDialog(TRUE, 0, 0, 4|2, _T("txt (*.txt) |*.txt||"), 0 ,0); CString Buffer; if(cDialog.DoModal() == IDOK) { CStdioFile File; File.Open(cDialog.GetPathName(), CFile::modeRead); File.SeekToBegin(); while(File.ReadString(Buffer)) { MessageBox(Buffer, _T("test"), MB_OK); } File.Close(); } }Woher hast du denn die Text-datei? Ich hab nämlich mal ein problem gehabt, dass ich für txt-files, die von einem Tool erstellt wurden halt den Zusatz "typeBinary" im Open brauchte. Ohne gings dann net. mit "typeText" gibts da keinen unterschied bei mir.
-
Ist das so gewollt, dass er beim 1. Durchlauf in den else Zweig rennt?
(Da ist i ja noch auf 0).
-
die Textdatei ist händisch erstellt worden und soll jetzt eben mit einem Programm editierbar sein und sollte auch nicht all zu sehr verändert werden, da sie von einem andern Programm eingelesen wird und als Steuerung verwendet wird.
isabeau: Ja, es sind nur die die zweite und dritte Zeile unbrauchbar (man kann ja noch ein ! einfügen, dass es lesbarer wird, aber zuerst sollten mal die richtigen Daten eingelesen werden *g*)
PS.: Danke für deine Mühen, Uruk

-
HA!...Ich hab eine ähnliche Textdatei jetzt händisch neu geschrieben... Es funktioniert. Naja wenigstens weiss ich nun wo der Hund begraben liegt. Ich muss schauen, ob das andre Programm damit klar kommt und dann kanns weiter gehn.
Danke für deine Hilfe
