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, &region ) == 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)? 🙂


Anmelden zum Antworten