zeilenweise einlesen mit CFile
-
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