Problem mit Textdateien



  • Hallo liebe Forumsmitglieder,
    ich schau schon seit längerem hier rein und hole mit immer wieder Anregungen für verschiedene Bereiche, doch nun hab ich selber ein Problem.
    Ich erlerne gerade Visual C++ 2005 und will da folgendes machen.
    Ich möchte eine Textdatei einlesen, sagen wir sie hat 1000 Zeilen. Diese Textdatei(.txt) soll Zeilenweise eingelesen werden und dann erstmal in einer Listbox, oder ähnlichem ausgegeben werden. Ich hab mir auch schon ein GUI mit Menüleiste und n paar Grundfunktionen gebaut.
    Das einlesen der Datei mach ich wie folgend:

    FILE * data;
    	data = fopen("c:\\test.txt", "r+w");
    	char acTmp[255];
    
    	while (!feof(data))
    	{	
    		fgets(acTmp,255,data);
    
    		if (!feof(data))
    	           {
    			//was mit den gespeicherten Zeilen machen
    	           }
            }
    
    fclose(data);
    

    Allerdings hab ich Probleme mit dem Pfad der Datei, der will diese nicht finden, obwohl sie da ist.
    Außerdem weiß ich nicht, wie ich dann die zwischengespeicherten Zeilen in die Listbox ausgebe 😞

    Ich wäre über die Hilfe von euch super glücklich 🙂
    Grüße
    TheRod


  • Mod

    Bist Du sicher, dass Du auch Schreibrechte hast?
    Was sagt errno nach dem fopen.

    Einfacher ist es einfach während dem lesen, sofort die Datei in das Edit Control, oder die Listbox auszugeben (CListBox::AddString).

    Dein Code lässt sich einfacher schreiben, die ganze feof Testerei kan entfallen:

    while (fgets(...))
    {
    // Mach was mit den daten
    }
    


  • Ich hab das jetzt geändert und bekomme nun beio fgets den Error C2660:
    function does not take 1 parameters.

    FILE * data;
    	data = fopen("c:\\test.txt", "r+");
    	char acTmp[255];
    	while (fgets(data))
    	{  
    
    		 //mach was mit der ausgelesenen Zeile  
    
    	}
    	fclose(data);
    

    Was läuft denn da falsch?



  • Du mußt schon alle Parameter für fgets() angeben 😉

    PS: Ein Vorschlag von mir: Verwende lieber fstreams anstelle der C Dateifunktionen.



  • Ja klar, das hatte ich ganz vergessen. Danke
    Aber wie übergebe ich nun die Zeilen an das Listenfeld?
    Ich hab für das Listenfeld auch schon eine Variable definiert m_cltLISTOUTPUT.
    Wie gesagt, ich bin da noch super neu drin und ich verstehe das gerade erst so langsam 🙂
    Und was hat das mit dem fstream aufsich?

    Vielen dank für die weitere Hilfe.


  • Mod

    Das einfachste ist:
    - Du erzeugst eine Dialog Anwednung mit dem Wizard.
    - Packst eine ListBox in den Dialog.
    - Fügst eine Memeber Variable für die Listbox
    - Packst den Code zum Lesen nach OnInitDialog
    - Fügst jede Zeile mit AddString in die Listbox.



  • Ich hab jetzt das jetzt alles eingerichtet und den Code nach meinem Verständniss aufgeschrieben.
    Er kompiliert auch ohne Probleme durch.
    Doch wenn ich die Option in meiner Menü-Leiste aufrufe bekomme ich den folgenden Fehler:

    Debug Assertion Failes
    file: fgets.c
    Line 60
    Espression : str != NULL

    Wenn ich Meldung dann ignoriere dann sagt das Programm mir:
    Memory could not be read.

    Hab ich im Code noch was falsch gemacht?

    FILE * data;
    	data = fopen("c:\\test.txt", "r+");
    	char acTmp[255];
    	while (fgets(acTmp,'\n',data))
    	{  
    
    		 m_ctlLISTOUTPUT.AddString("acTmp"); 
    
    	}
    	fclose(data);
    


  • 🙄 der fgets()-Aufruf in deinem ersten Beispiel war doch schon in Ordnung - warum bastelst du da noch an den Parametern herum?

    (und nebenbei wird dieser Code dir die Ausgabeliste mit "acTmp"-Einträgen füllen)



  • Hmm, okay. Dann nochmal.
    Ich hab das mit den Parametern wieder geändert und es sieht jetzt so aus:

    while (fgets(acTmp,255,data))
    	{  
    		m_ctlLISTOUTPUT.AddString("acTmp"); 
    	}
    

    Wenn ich die Parameter nicht so angebe, dann kommt da wieder der C2660 Error, wie oben.
    Ich dachte, dass in dem acTemp die einzelnen Zeilen zwischen gespeichert werden?!
    Oh man, langsam bin ich ein wenig verwirrt 😕
    Könntet ihr mir vieleicht mit einem Codeschnipsel auf die Sprünge helfen?



  • Erstmal solltest du die Anführungszeichen bei dem AddString()-Aufruf weglassen (wir sind hier nicht bei PHP).

    Zweitens: Ja, in acTemp landet die aktuelle Eingabezeile, die du auch auswerten kannst. Aber eventuell solltest du trotz allem eine Sicherheitsabfrage einbauen, ob die Datei korrekt geöffnet werden konnte.

    Drittens: Auch wenn ich mich widerhole - nimm lieber fstream's (oder CFile):

    ifstream data("...");
    string zeile;
    while(getline(data,zeile))
    {
      m_ctlLISTOUTPUT.AddString(zeile.c_str());
    }
    


  • Oder:

    // Grundidee **OHNE** jegliche Fehlerbehandlung
    CFile inFile("c:/test.txt", CFile::modeRead);
    CArchive archive(&inFile, CArchive::load, inFile.GetLength());
    CString line;
    while (archive.ReadString(line))
    {
        m_ctlLISTOUTPUT.AddString(line);
    }
    archive.Close();
    inFile.Close();
    


  • Also nochmals danke das ihr so viel Geduld mit mir habe 🙂
    Ich hab das ganze, wie in deinem Code nach ifstream umgestellt und muuste mich da eine Menge mit Libs herumschlagen, bis die alle korrekt eingebunden waren.
    Allerdings habe ich dann einen Fehler bekommen der sagt, dass er die MSVCP60D.dll nicht findet. Ich habe diese DLL auch in den Ordner meiner .exe gelegt aber er will die exe immer noch nicht ausführen.
    Ich hab dann mal von Debug auf Release umgestellt und dann funzt das.
    Das mit der Listbox etc. hab ich jetzt ja auch verstanden, aber irgendwie gibt er trotzdem nix aus 😞
    Der Pfad der Textdatei lautet:
    H:\My Databases\Trace Projekt\Debug und in dem Debugordner liegt dann die .txt.
    Hier nochmal mein Code

    ifstream data("h:\\\Test.txt"); 
    	string  zeile; 
    	while(getline(data,zeile)) 
    	{ 
    		m_ctlLISTOUTPUT.AddString(zeile.c_str()); 
    	}
    


  • Dann mußt du auch den kompletten Pfad angeben - du versuchst die Datei 'test.txt' im Stammverzeichnis von Laufwerk H: zu öffnen.
    (Alternativ kannst du auch einen relativen Pfad angeben - wenn du das "H:\" weglässt, sucht das Programm die Datei im aktuellen Arbeitsverzeichnis.)


  • Mod

    h:\\\Test.txt
    Wird zu
    h:\<tabctrl-Zeichen>est.txt



  • Ich werde da nochmal n bissel rumprobieren.
    Der Kompieler meckert da irgendwie, dass Addstring die Konvertierung des Parameters 1 von 'const char *' in 'LPCTSTR' nicht möglich macht.

    Vielen Dank für die Hilfe 👍


Anmelden zum Antworten