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