Изменение всех заглавных букв файла строчными, вывод количества символов текста из файла

  1. Изучая классы, работу с ними, а также работу с чтением и записью файлов столкнулся с такой проблемой, что при чтении из txt файла в переменную типа string пытаюсь изменить все заглавные буквы с помощью алгоритма transform() и метода tolower. В моей ситуации это почему-то не работает, пробовал писать более простые отдельные конструкции в основном теле с тем же алгоритмом и всё работает корректно, даже с русским языком, но используя в классе, получается так, что заглавные буквы не меняются на строчные.
  2. Также решив считать количество символов из файла столкнулся с тем, что различные методы выдают лишь объём переменной в байтах, зная, что UTF-8 кодируется, как от 1, так и до 4 байт на символ, задался вопросом, а как можно получить именно количество символов, а не объём? Тип данных и работа с wstring не подходит, так как использую метод getline.
  3. В конце хотел бы дополнить, что при использовании в основном теле программы (int_main) поддержки русского языка через setlocale записывает в файл полную белеберду, я так понял это из-за кодировки ANSI, которая не поддерживает кириллицу, но как тогда использовать кириллицу при выводе чего-либо в консоль?

Есть ли какие-то варианты решения данных проблем? Заранее спасибо!

Код основного тела программы:

#include <iostream>
#include "Texts.h"
#include "Letters.h"
using namespace std;

int main()
{

    Texts texts;
    Letters letters;

    texts.WriteToFile();

    cout << "Lenth of ArtisticText: " << letters.NumOfLettersArtText() << endl;
    cout << "Lenth of ScientisticText: " << letters.NumOfLettersSciText() << endl;

    
    return 0;
}

Код класса, отвечающего за тексты:

#pragma once
#include <iostream>
#include <string>
#include <fstream>
#include <algorithm>
using namespace std;

class Texts
{
private:
    
    string ConvertArtTextToLowLetter()
    {
        string ArtisticText = ReadFromArtisticText();

        transform(ArtisticText.begin(), ArtisticText.end(), ArtisticText.begin(), tolower);
        return ArtisticText;
    }

    string ConvertSciTextToLowLetter()
    {
        string ScientisticText = ReadFromScientisticText();

        transform(ScientisticText.begin(), ScientisticText.end(), ScientisticText.begin(), tolower);
        return ScientisticText;
    }

public:
    
    string ReadFromArtisticText()
    {
        string ArtisticText;
        ifstream fin_Art("ArtisticText.txt");

        if (fin_Art.is_open())
            getline(fin_Art, ArtisticText);

        fin_Art.close();
        return ArtisticText;
    }

    string ReadFromScientisticText()
    {
        string ScientisticText;
        ifstream fin_Sci("ScientisticText.txt");

        if (fin_Sci.is_open())
            getline(fin_Sci, ScientisticText);

        fin_Sci.close();
        return ScientisticText;
    }


    void WriteToFile()
    {
        string ArtisticText = ConvertArtTextToLowLetter();
        ofstream fout_art;
        
        fout_art.open("LowArtisticText.txt");
        if (fout_art.is_open()) {
            fout_art << ArtisticText;
        }
        fout_art.close();

        string ScientisticText = ConvertSciTextToLowLetter();
        ofstream fout_sci;

        fout_sci.open("LowScientisticText.txt");
        if (fout_sci.is_open()) {
            fout_sci << ScientisticText;
        }
        fout_sci.close();
    }

};


Код класса, отвечающего за символы:

#pragma once
#include "Texts.h"
#include <iostream>
#include <string>
using namespace std;

class Letters
{

private:
    int numOfLetters;
    string ScientisticText;
    string ArtisticText;
    Texts texts;

public:
    int NumOfLettersArtText()
    {
        ArtisticText = texts.ReadFromArtisticText();
        numOfLetters = ArtisticText.length();
        return numOfLetters;
    }

    int NumOfLettersSciText()
    {
        ScientisticText = texts.ReadFromScientisticText();
        numOfLetters = ScientisticText.length();
        return numOfLetters;
    }
};

Ответы (0 шт):