zeilenweise einlesen mit CFile
-
Hi nochmal
ich versuche gerade mit CFile eine Textdatei zeilenweise auszulesen. Ich hab zwar hier im Board schon einige Beispiele gesehen, aber die beziehen sich leider nicht auf CFile. Mit CFile.Read() kann man ja nur die Anzahl der Bytes angeben die in einem Rutsch gelesen werden sollen, ich weis aber nicht wieviele Bytes jede Zeile hat
Gruß Basti/edit: Bevor jemand auf die Idee CStdioFile kommt:
Remarks MFC for Windows CE does not support the following methods of the standard MFC CStdioFile class: CStdioFile::ReadString CStdioFile::WriteString CStdioFile::CFile CStdioFile::Abort CStdioFile::Flush CStdioFile::Close CStdioFile::Read CStdioFile::Write CStdioFile::LockRange CStdioFile::UnlockRange CStdioFile::GetPosition CStdioFile::Open CStdioFile::Duplicate
Schade eigentlich
-
Muß es unbedingt CFile sein? Wenn ja, mußt du wohl solange Zeichen einlesen, bis du ein '\n' triffst (entweder wirklich einzeln holen oder blockweise mit Zwischenspeicher).
Aber für Textverarbeitung ist CStdioFile vermutlich besser geeignet.
-
naja, wie gesagt, in der Hilfe zu CStdioFile steht leider drinne dass es für WindowsCE nicht supportet wird (ich programmiere grade für Mobile Devies) und eine andere methode fällt mir grade nicht ein, da iofstreah.h, ifstream.h und ofstream.h ebenfalls ALLE nicht zur Verfügung stehen
ZUr Not wären da ja noch die C-Runtime Funktionen mit fread() und so und eben ReadFile von den API-Funktionen. Aber kann man mit den 2 Möglichkeiten zeilenweise einlesen?!
Gruß BAsti
-
sebastian87 schrieb:
naja, wie gesagt, in der Hilfe zu CStdioFile steht leider drinne dass es für WindowsCE nicht supportet wird (ich programmiere grade für Mobile Devies) und eine andere methode fällt mir grade nicht ein, da iofstreah.h, ifstream.h und ofstream.h ebenfalls ALLE nicht zur Verfügung stehen
Wenn alle bekannten Funktion wegfallen, bleibt dir nur noch der Weg, das selber zu schreiben.
Primitivlösung:
CString data; char buf; while(InFile.Read(&buf,1)>0 && buf!='\n') data+=buf; return data;
ZUr Not wären da ja noch die C-Runtime Funktionen mit fread() und so und eben ReadFile von den API-Funktionen. Aber kann man mit den 2 Möglichkeiten zeilenweise einlesen?!
Gruß BAstiWas ist mit fgets() und fscanf()? (bei ReadFile() bin ich mir nicht ganz sicher, fread() liest ebenfalls blockweise)
-
hmm.. also fgets kann zeilenweise lesen und in einen chararray abspeichern, sagt zumindest meine Hilfe. Jetzt frag ich mich aber ob man statt des Chararrays auch ohne Probleme mit CString arbeiten kann, die kann man ja ganz einfach in einander überführen, oder? mit fgets hatte ich zwar nie zu tun, aber dann muss ich mich mal n bissl jetz damit befassen
Gruß Basti
-
sebastian87 schrieb:
hmm.. also fgets kann zeilenweise lesen und in einen chararray abspeichern, sagt zumindest meine Hilfe. Jetzt frag ich mich aber ob man statt des Chararrays auch ohne Probleme mit CString arbeiten kann, die kann man ja ganz einfach in einander überführen, oder? mit fgets hatte ich zwar nie zu tun, aber dann muss ich mich mal n bissl jetz damit befassen
Gruß BastiNein, fgets() kann nicht direkt auf einem CString arbeiten (wenn du ihm einen CString übergeben könntest, würde es vermutlich dessen Speicherverwaltung pulverisieren). Aber du kannst dir mit GetBuffer() ein char-Array holen, das du beschreiben kannst:
CString data; fgets(data.GetBuffer(max_len),max_len,InFile); data.ReleaseBuffer(); return data;
-
aber CString ist doch ein nullterminiertes Chararray, also im prinzip
char[50] testchar; CString teststring; teststring = testchar;
MÜSSTE ja gehen, oder nich?!
-
Nein, CString ist eine vollwertige Klasse, die ihre Daten intern in einem (möglicherweise nullterminierten) char-Array verwaltet. Es bietet jedoch Konvertierungsfunktionen, um mit reinen char-Arrays zusammenarbeiten zu können.
(btw, die letzte Anweisung klappt nicht - du kannst ein Array nicht per Zuweisung füllen (das geht noch nichtmal, wenn du nur mit Arrays hantierst))
-
Und wie kann ich nun die Datei zeilenweise bis zum Ende durchsuchen?
ich hab versucht eine whileschleife zu machen while(!read_file.eof){}
.eof gibt es aber nicht. Nun kann man mit seek irgendwie an das ende der Datei hüpfen. Aber es liefert ja keinen Wert zurück, bei dem ich vergleichen könnte ob ich mit meinem Zeilenweisen Lesen am ende angekommen bin.
Achso: fgets liest MIT dem Zeilenumbruchschar ein. Wenn ich jetzt in eine Schleife packe dass fgets die ganze Datei durchsuchen muss, springt der beim nächsten Aufruf automatisch in die nächste Zeile und liest diese in einen char, oder wie sieht das aus ?
Gruß und Danke für die Hilfe
Basti
-
sebastian87 schrieb:
ich hab versucht eine whileschleife zu machen while(!read_file.eof){}
.eof gibt es aber nicht. Nun kann man mit seek irgendwie an das ende der Datei hüpfen. Aber es liefert ja keinen Wert zurück, bei dem ich vergleichen könnte ob ich mit meinem Zeilenweisen Lesen am ende angekommen bin.Was für einen Typ hat denn read_file? Wenn du mit FILE* arbeitest, heißt der Aufruf korrekterweise
while(!feof(read_file))...
.Achso: fgets liest MIT dem Zeilenumbruchschar ein. Wenn ich jetzt in eine Schleife packe dass fgets die ganze Datei durchsuchen muss, springt der beim nächsten Aufruf automatisch in die nächste Zeile und liest diese in einen char, oder wie sieht das aus ?
Ja, der Lesezeiger steht beim nächsten Aufruf auf dem Anfang der neuen Zeile - eingelesen wird sie erst, wenn du es benötigst.
-
Ich stehe selber vor dem Problem und möchte eine Datei Zeilenweise auslesen und diese in eine Variable speichern. Wär ganz cool wenn du deinen Code mal posten könntest und vll auch wie deine Datei aufgebaut sein soll. Danke
-
also ich habe jetzt mal folgenden Code versucht:
FILE *read_file; CString cs_eingabe, cs_zeile_ladeliste; while(!feof(read_file)) { if(fgets(zeile, 50,read_file)==NULL) { cs_messagetext="Fehler beim Lesen der Datei"; cs_messagetitle="Fehler: fgets"; MessageBox(cs_messagetext, cs_messagetitle, MB_OK); } else { cs_zeile_ladeliste=zeile; cs_messagetitle="Test: char-array -> CString"; MessageBox(cs_zeile_ladeliste, cs_messagetitle, MB_OK);
und es hat gut geklappt, dabei hab ich ja wirklich nur den chararray in einen CString gespeichert. Konvertiert die Klasse sich das automatisch, oder wie kann ich mir jetz erklären dass das funktioniert?
//edit: @Lenni:
Meine Test-Datei sieht so aus:
G12345678901;123456;1234 G00123456789;001235;0012 G47785909068;000057;3456 G66479086355;345677;0957 G12345678901;123456;1234 G00123456789;001235;0012 G47785909068;000057;3456 G66479086355;345677;0957 G12345678901;123456;1234 G00123456789;001235;0012 G47785909068;000057;3456 G66479086355;345677;0957 G12345678901;123456;1234 G00123456789;001235;0012 G47785909068;000057;3456 G66479086355;345677;0957 G12345678901;123456;1234 G00123456789;001235;0012 G47785909068;000057;3456 G66479086355;345677;0957 G12345678901;123456;1234 G00123456789;001235;0012 G47785909068;000057;3456 G66479086355;345677;0957 G12345678901;123456;1234
Und ist 200kB groß um zu schauen ob das Programm auch unter schwereren bedingungen mit großen Datenmengen zurechtkommt (Netzwerk, Arbeitsspeicher usw)
-
sebastian87 schrieb:
und es hat gut geklappt, dabei hab ich ja wirklich nur den chararray in einen CString gespeichert. Konvertiert die Klasse sich das automatisch, oder wie kann ich mir jetz erklären dass das funktioniert?
Ja, CString kopiert den Inhalt des Arrays automatisch (und da alle beteiligten Funktionen sich an die übliche String-Darstellung als nullterminierte char-Array halten, hat es damit auch keine Probleme).
-
Wie sieht denn deine initialisierung aus? Das ist ja nicht der gesamte Quelltext? Also mit Datei laden und sowas? Also wär super wenn du mal alles was zu dem Datei laden und speichern etc. gehört.
-
naja bisher schaut es so aus:
FILE *read_file; CString cs_eingabe, cs_zeile_ladeliste; ... ... ... if (b_is_barcode==TRUE) { if (( read_file = fopen("\\My Documents\\ladeliste.txt", "r"))) { while(!feof(read_file)) { if(fgets(zeile, 50,read_file)==NULL) { cs_messagetext="Fehler beim Lesen der Datei"; cs_messagetitle="Fehler: fgets"; MessageBox(cs_messagetext, cs_messagetitle, MB_OK); } else { cs_zeile_ladeliste=zeile; if (cs_zeile_ladeliste.Find(cs_eingabe,0)) { cs_messagetext="Die Gebindenummer wurde gefunden!"; cs_messagetitle="Found: Gebindenummer!"; MessageBox(cs_messagetext, cs_messagetitle, MB_OK); break; } } } }
Is aber alles Testcode, ich bin Anfänger und für richtigkeit übernehme ich keine haftung
Gruß Basti
-
Okay gut ich gucke mir das mal an. Danke
achja noch ein Tip! es reicht wenn du
MessageBox("Fehler beim Lesen der Datei","Fehler: fgets", MB_OK);
so muss du nicht für den Text immer eine Variable nehmen. So ist der Code übersichtlicher
Gruß Lenni
-
fast
bei mir kamen da immer fehlermeldungen wo ich ned wusste wie ich die wegbekomme, aber mittlerweile gehts, also bie mir sieht der befehl dann so aus:MessageBox(_T("Fehler beim Lesen der Datei"),_T("Fehler: fgets"), MB_OK);
Gruß Basti