Zeilen einer einfachen Datei zählen



  • Ich wollte ein Template bauen welches die Zeilenzahl '\n' in einer einfachen Datei möglichst schnell zählt. Hier mein erster Versuch:

    template< typename T >
    std::size_t count_lines ( const T & s )
    {
        std::wifstream f( s.c_str() );
        f.unsetf( std::ios_base::skipws );
    
        std::wstringstream buffer;
        buffer << f.rdbuf();
    
        using is = std::istream_iterator;
        using tv = typename T::value_type;
        using tt = typename T::traits_type;
    
        return std::count( is< T , tv , tt > >( buffer.str() ) , is< T , tv , tt > >() , static_cast< tv >( '\n' ) );
    }
    

    Bekomme beim Aufruf mit einem QString::toStdString() folgenden Fehler:

    error: C2440: '<function-style-cast>': cannot convert from 'std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>' to 'std::istream_iterator<std::wstring,wchar_t,std::char_traits<wchar_t>,ptrdiff_t>'
    

    Was mache ich falsch?



  • Zweiter Versuch:

    template< typename T >
    std::size_t count_lines ( const T & s )
    {
        using tv = typename T::value_type;
        using tt = typename T::traits_type;
        using is = typename std::istream_iterator< T , tv , tt >;
    
        std::basic_ifstream< tv , tt > f( s );
        f.unsetf( std::ios_base::skipws );
    
        std::basic_stringstream< tv , tt , std::allocator< tv > > buffer;
        buffer << f.rdbuf();
    
        return std::count( is( buffer.str() ) , is() , static_cast< tv >( '\n' ) );
    }
    

    Der Fehler ist immer noch derselbe.



  • Ich würds einfach so machen:

    #include <iostream>
    #include <limits>
    
    using namespace std;
    
    int main() {
        size_t lc = 0;
        for (; cin.ignore(numeric_limits<streamsize>::max(), '\n') && !cin.eof(); ++lc);
        cout << lc << '\n';
    }
    

    Natürlich sollte man sich überlegen, ob eine Datei mit nur einem Buchstaben drin (ohne "\n" am Ende) schon eine Zeile hat oder nicht. wc -l meint 0, habe ich jetzt auch so gemacht.

    Was willst du eigentlich mit deinen Templates und/oder dem QString erreichen?!



  • Was macht das?

    is< T , tv , tt > >( buffer.str() )
    


  • manni66 schrieb:

    Was macht das?

    is< T , tv , tt > >( buffer.str() )
    

    Es ist mein Naiver Versuch etwas wie std::wstringstream zu basteln.



  • wob schrieb:

    Ich würds einfach so machen:

    #include <iostream>
    #include <limits>
    
    using namespace std;
    
    int main() {
        size_t lc = 0;
        for (; cin.ignore(numeric_limits<streamsize>::max(), '\n') && !cin.eof(); ++lc);
        cout << lc << '\n';
    }
    

    Natürlich sollte man sich überlegen, ob eine Datei mit nur einem Buchstaben drin (ohne "\n" am Ende) schon eine Zeile hat oder nicht. wc -l meint 0, habe ich jetzt auch so gemacht.

    Was willst du eigentlich mit deinen Templates und/oder dem QString erreichen?!

    Cool, danke


Anmelden zum Antworten