Zeile für Zeile aus Textdatei auslesen



  • 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