txt datei einlesen und bearbeiten in c++
-
bmth schrieb:
...
grausam
du hast dir nicht mal mühe gemacht, den geposteten code zu verstehen -.-#include <string> //string #include <iostream> //cin, cout, endl #include <fstream> //ifstream #include <cstdlib> //EXIT_FAILURE #include <map> //map #include <locale> //locale using namespace std; //auch, wenn ich eigtl kein freund davon bin ^^ typedef map<char, unsigned int> Tchar_counter; int main() { cout << "Dateiname:" << endl; string filename; std::getline(cin, filename); ifstream input(filename.c_str()); if(!input.is_open()) return EXIT_FAILURE; Tchar_counter char_counter; char character; locale our_locale; while( input.get(character) ) { if( isalpha(character, our_locale) ) character = tolower(character, our_locale); ++char_counter[character]; } Tchar_counter::mapped_type sum = Tchar_counter::mapped_type(); for(Tchar_counter::const_iterator i(char_counter.begin()), e(char_counter.end()); i != e; ++i) { sum += i->second; } cout.precision(2); for(Tchar_counter::const_iterator i(char_counter.begin()), e(char_counter.end()) ; i != e; ++i) { float percent = i->second/float(sum); cout << i->first << ": " << percent*100 << " %" << endl; } //schließen verhindern -> enter drücken um zu schließen cin.clear(); cin.ignore( cin.rdbuf()->in_avail() ); cin.get(); }
nicht optimal - aber allemal besser, als das, was du hattest
bb
-
Warum denn immernoch printf( )!?
Btw: In welcher Steinzeit hat man mit fopen_s( ) gearbeitet?
-
Also so alt/schlecht scheint fopen_s nach meinen Eindrücken nicht zu sein. Da ich (gerade noch mal ein wenig nachgeschaut) dutzende Beispiele damit gefunden habe, die zudem noch gar nicht so alt sind ^^.
So weiter gehts
Das Programm läuft jetzt wunderprächtig
Vielen Dank noch mal für die Hilfe!
Eine weitere Sache wäre jetzt aber noch die Eingabe des Users. Ich hatte mir überlegt eine kleine Kontrolle einzubauen ob es sich z.B. um eine ASCII oder ANSI Datei handelt.
Dafür brauche ich ja unter anderem CharToOem bzw. OemToChar. Dafür habe ich auch schon Beispiele gefunden, jedoch waren die leider nicht so das wahre fand ich. Eins wäre z.B. dieses hier:
char charToOem(char character) { char conv[2] = {character, '\0'}; // Vorsicht: in = out ist nur bei der ANSI-Version erlaubt CharToOemA(conv, conv); return conv[0]; } bool getCharFromConsole(int x, int y, char& character) { CHAR_INFO buffer; COORD bufferSize = {1, 1}; COORD bufferCoord = {0, 0}; SMALL_RECT region = {x, y, x, y}; if(ReadConsoleOutput(GetStdHandle(STD_OUTPUT_HANDLE), &buffer, bufferSize, bufferCoord, ®ion ) == 0) return false; else { character = buffer.Char.AsciiChar; return true; } }
Und dazu gehörig entsprechend:
char character; if(getCharFromConsole(1, 0, character)) { printf("\n\nGelesen: %c\n\n", charToOem(character)); } else { // Fehler beim Lesen des Zeichens ... // Passiert z.B. bei ungültigen Koordinaten }
Jetzt Frage ich mich ob man das Ganze nicht komfortabler und "schöner" lösen kann. Hätte jemand von euch da eine alternative Lösung (Idee)?