Zeile für Zeile aus Textdatei auslesen



  • Hi,
    ich versuche ein Programm zu schreiben, welches Wörter der Reihe nach bearbeitet, dafür will ich eine Textdatei haben, in welcher Wörtern aufgelistet sind, die jeweils eine Zeile besetzen. Ich will dann über das Programm sagen können, in welcher Zeile sich welches Wort befindet und natürlich möchte ich auch die Wörter auslesen können. Nun hab ich aber keine Ahnung wie ich anfangen soll und wäre über eine Antwort sehr erfreut..



  • Naja, du könntest von einem filestream aus mit std::getline() alle Zeilen in einen vector lesen, und diesen dann nach dem Wort durchsuchen.



  • Versuche es mal damit...

    ifstream dat_ein;
    dat_ein.open(DATEINAME.c_str(), ios_base::in);
    while(!dat_ein.eof())
    {
         dat_ein >> EINGABE;
         cout << EINGABE << endl;
    }
    dat_ein.close();
    


  • wenn du damit noch weiterarbeiten und spaeter noch wissen willst, in welcher zeile welches wort steht, benutz z.B. nen vector:

    #include <vector>
    #include <string>
    #include <fstream>
    #include <iostream>
    using namespace std;
    
    // ...
    
    vector< string > zeilen;
    
    ifstream fin;
    fin.open( "DATEINAME", ios_base::in );
    if( !fin )
      cout << "Datei konnte nicht geoeffnet werden!" << endl;
    else
    {
      while( !fin.eof() )
      {
        char cZeile[ 256 ];
        fin.getline( czeile, 256 );
        string sZeile( cZeile );
        zeilen.push_back( sZeile );
      }
    }
    / ***
    

    (ungetestet!)

    wenn du nun den vector nicht aenderst (elemente einfuegen/loeschen), ist position im vector gleich der zeile in der datei.
    also das 5. element im vector (zeilen.at( 4 )) steht auch in der 5. zeile der datei (sofern man bei 1 anfaengt die zeilen zu zaehlen, nicht bei 0).

    mfg,
    julian



  • Julian__ schrieb:

    #include <vector>
    #include <string>
    #include <fstream>
    #include <iostream>
    using namespace std;
    
    // ...
    
    vector< string > zeilen;
    
    ifstream fin;
    fin.open( "DATEINAME", ios_base::in );
    if( !fin )
      cout << "Datei konnte nicht geoeffnet werden!" << endl;
    else
    {
      while( !fin.eof() )
      {
        char cZeile[ 256 ];
        fin.getline( czeile, 256 );
        string sZeile( cZeile );
        zeilen.push_back( sZeile );
      }
    }
    / ***
    

    Wieso immer der Umweg über char-arrays? 🙄

    #include <vector>
    #include <string>
    #include <fstream>
    #include <iostream>
    
    std::vector<std::string> zeilen;
    
    std::ifstream fin("DATEINAME", std::ios::in);
    if(!fin)
    {
    	std::cout << "Datei konnte nicht geoeffnet werden!" << std::endl;
    }
    else
    {
    	std::string zeile;
    	while(!fin.eof())
    	{
    		std::getline(fin, zeile);
    		zeilen.push_back(zeile);
    	}
    }
    

    (Ebenfalls ungetestet 🤡)



  • stimmt, da ist ja noch die globale std::getline-funktion ...
    danke fuer die korrektur!

    mfg,
    julian



  • Danke für die schnelle Antwort, nur leider hab ich jetzt ein neues Problem da mein Compiler 4 Warnungen und einen Fehler angibt.

    warning C4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,int>' : identifier was truncated to '255' characters in the debug information

    warning C4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > *,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> > &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > *,int>' : identifier was truncated to '255' characters in the debug information

    c:\programme\microsoft visual studio\vc98\include\vector(39) : warning C4786: 'std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >:: vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >' : identifier was truncated to '255' characters in the debug information

    c:\programme\microsoft visual studio\vc98\include\vector(60) : warning C4786: 'std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::
    ~vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >' : identifier was truncated to '255' characters in the debug information

    error C2065: 'Lese_Liste' : undeclared identifier

    Mein Quelltext

    vector<string> zeilen;
    
    	ifstream OeffneWordlist(DateiName, ios::in);
    
    	if (OeffneWordlist != NULL)
    	{
    		string zeile; 
    
    		while(!OeffneWordlist.eof()) 
    		{ 
    			getline(OeffneWordlist, zeile); 
    			zeilen.push_back(zeile); 
    		}
    
    	}
    

    Hab leider keine Ahnung was ich falsch gemacht hab, wäre schön wenn mir dadrauf auch jemand eine Antwort geben könnte



  • An dem Stück sieht soweit ich es sehe alles richtig aus, vielleicht postest du noch etwas mehr code?



  • Die komplette Funktion:

    #include <iostream>
    #include <windows.h>
    #include <conio.h>
    #include <fstream>
    #include <string>
    #include <vector>
    
    #include "Funktionen.h"
    
    using namespace std;
    
    int UeberpruefeWordlist()
    {
    
    	system ("cls");
    	cout << "Bitte geben Sie den Dateinamen der Wordlist an: ";
    
    	char DateiName[1024];
    	char PufferC;
    	int PufferI;
    
    	for (int Eingabe = 0; Eingabe < 1024; Eingabe++)
    
    	{
    		PufferC = _getch();
    
    		PufferI = static_cast<int> (PufferC);
    
    		if (PufferI == 28)
    		{
    			DateiName[Eingabe] = '\0';
    			Eingabe = 1024;
    		}
    
    		else
    		{
    			cout << PufferC;
    
    			DateiName[Eingabe] = PufferC;
    		}		 
    	}
    
    	vector<string> zeilen;
    
    	ifstream OeffneWordlist(DateiName, ios::in);
    
    	if (OeffneWordlist != NULL)
    	{
    		string zeile; 
    
    		while(!OeffneWordlist.eof()) 
    		{ 
    			getline(OeffneWordlist, zeile); 
    			zeilen.push_back(zeile); 
    		}
    
    	}
    
    	else
    		MessageBox(NULL, "Wordlist nicht vohanden, bitte geben Sie einen anderen Namen an", "Fehler", MB_OK | MB_ICONERROR);
    
    	return 0;
    }
    


  • ich hab es mal eben probiert und dieses testprogramm funktioniert bei mir problemlos:

    #include <iostream>
    #include <windows.h>
     // #include <conio.h> /*  brauch ich nicht :) */
    #include <fstream>
    #include <string>
    #include <vector>
    
    // #include "Funktionen.h" /* hab ich nicht :) */
    
    using namespace std;
    
    vector< string > UeberpruefeWordlist()
    {
    	string dateiname;
        system ("cls");
        cout << "Bitte geben Sie den Dateinamen der Wordlist an: ";
    	cin >> dateiname;
    	cout << endl;
    
        vector<string> zeilen;
        ifstream OeffneWordlist(dateiname.c_str(), ios::in);
        if (OeffneWordlist != NULL)
        {
            string zeile;
            while(!OeffneWordlist.eof())
            {
                getline(OeffneWordlist, zeile);
                zeilen.push_back(zeile);
            }
        }
    	else
    		MessageBox(NULL, "Wordlist nicht vohanden, bitte geben Sie einen anderen Namen an", "Fehler", MB_OK | MB_ICONERROR);
    
        return zeilen;
    }
    
    int main()
    {
    	vector< string > zeilen = UeberpruefeWordlist();
    	bool leer = true;
    	for( int i = 0; i < zeilen.size(); i++ )
    		if( zeilen.at( i ) != "" ) // => mindestens in einer zeile steht etwas, also keine komplett leere datei -> ergebnisse ausgeben und schleife beenden
    		{
    			leer = false;
    			for( int j = 0; j < zeilen.size(); j++ )
    			{
    				cout << "zeile " << j + 1;
    
    				// nur fuer die einrueckung der ausgabe
    				if( j >= 99 )
    					cout << "\t";
    				else if( j >= 9 )
    					cout << "\t\t";
    				else
    					cout << "\t\t\t";
    
    				cout << zeilen.at( j ) << endl;
    			}
    			break;
    		}
    	if( leer )
    		cout << "keine eintraege vorhanden!" << endl;
    	return 0;
    }
    

    zugegeben, wirklich schoen ist das nicht, aber es funktioniert gut.

    mfg,
    julian



  • Vielen Dank,
    jetz funktioniert es endlich *fg* ich bekomme zwar noch 5 Warnungen, aber das Programm lässt sich endlich ohne Fehlermeldung compilieren
    vg KKaiser



  • Wenn das alles C4786-Warnungen wie oben sind, kannst du die gefahrlos ignorieren (die sagen lediglich aus, daß die angegebenen Namen zu lang sind für deinen Debugger).



  • es gibt bei den for-schleifen ein paar warnungen, weil man signed- und unsigned-int vergleicht.
    sollte hier aber keine probleme geben.

    mfg,
    julian



  • Ok Danke


Anmelden zum Antworten