Datei Zeichenweise einlesen - Warnung ignorieren, bzw. verhindern?



  • #include <string>
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    bool char_valid (int c)
    {
    	//...
    	return true;
    }
    
    bool read_file ( string& file_content, string filename )
    {
    	ifstream infile ( filename.c_str () );
    	int c = 0;
    	if ( infile == NULL )
    	{
    		cout << filename << ": " << strerror(errno) << endl;
    		return false;
    	}
    	while ( infile.eof() == false )
    	{
    		c = infile.get();
    		if ( char_valid(c) )
    			file_content.push_back (c); // warning C4244: 'Argument': Konvertierung von 'int' in 'char', möglicher Datenverlust
    	}
    	return true;
    }
    
    int main()
    {
    	string f("test.txt");
    	string content;
    
    	read_file (content, f);
    
    	return 0;
    }
    

    Hallo, ich bekomme ne Warnung wegen Zeile 25:

    warning C4244: 'Argument': Konvertierung von 'int' in 'char', möglicher Datenverlust

    Klar, kann ich wegcasten:

    file_content.push_back ((char)c);
    

    Oder gibts nen push_back für chars?



  • selber casten, das sagt dem compiler, daß es nicht aus versehen ist, sondern pure absicht.

    file_content.push_back (char(c));
    

    aber wieso ist c überhaupt ein int??



  • volkard schrieb:

    aber wieso ist c überhaupt ein int??

    So kenne ich das von C her, einlesen in einen int bis EOF. Vermutlich geht das in C++ anders.



  • 💡 Brauche ich hier nen int? Ich meine nein! In C war es nötig, um eine Verwechslung EOF mit 0xFF zu Vermeiden, aber hier prüfe ich ja infile.eof() == false, kann also gleich nen char nehmen! 💡



  • datread0r schrieb:

    volkard schrieb:

    aber wieso ist c überhaupt ein int??

    So kenne ich das von C her, einlesen in einen int bis EOF. Vermutlich geht das in C++ anders.

    ja. üblich ist wohl eher

    while ( infile.get(ch) ) //identisch mit while(infile.get(ch),infile)
        { 
            if ( char_valid(c) ) 
                file_content.push_back (c);
        }
    

    vor allem ist es falsch, vor dem get auf eof zu prüfen. eof ist erst dem stream bekannt, nachdem das mist-zeichen gelesen wurde.



  • Nö, doch nicht:

    char c = infile.get();
    

    warning C4244: '=': Konvertierung von 'int' in 'char', möglicher Datenverlust.



  • @volkard: sorry zu spät gesehen!
    Danke, so geht es!


Anmelden zum Antworten