0
  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 &lt;&lt; &quot;Lenth of ArtisticText: &quot; &lt;&lt; letters.NumOfLettersArtText() &lt;&lt; endl;
cout &lt;&lt; &quot;Lenth of ScientisticText: &quot; &lt;&lt; letters.NumOfLettersSciText() &lt;&lt; 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(&quot;ArtisticText.txt&quot;);

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

    fin_Art.close();
    return ArtisticText;
}

string ReadFromScientisticText()
{
    string ScientisticText;
    ifstream fin_Sci(&quot;ScientisticText.txt&quot;);

    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(&quot;LowArtisticText.txt&quot;);
    if (fout_art.is_open()) {
        fout_art &lt;&lt; ArtisticText;
    }
    fout_art.close();

    string ScientisticText = ConvertSciTextToLowLetter();
    ofstream fout_sci;

    fout_sci.open(&quot;LowScientisticText.txt&quot;);
    if (fout_sci.is_open()) {
        fout_sci &lt;&lt; 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;
}

};

  • Забавно — "Тип данных и работа с wstring не подходит, так как использую метод getline" — это примерно как жаловаться на то, что не получается найти синус какой-нибудь, только тип double не предлагать... Можно, конечно, но через одно неприличное место. А вообще см. https://ru.stackoverflow.com/q/459154/195342 – Harry Feb 18 '24 at 06:51
  • Я же не написал, что не предлагать чего-либо, я просто написал, что в данной реализации не подходит, а как иначе написать, используя wstring и расширенные типы данных, честно говоря, не знаю, поэтому и обратился за помощью – Malekis Feb 18 '24 at 07:31
  • Читая в вике utf-8 легко заметить, что размер utf-8 символа в байтах кодируется старшими 5-ю битами этого байта (можно использовать таблицу индексируемыми этиими битами, а можно упаковать ее в константу #define UTF8_LTAG (0x3a55ULL << 48)) / При перекодировке заглавных в строчные (если ограничиться русскими буквами и ascii) придется отдельно смотреть на ёЁ – avp Feb 18 '24 at 10:48
  • "поддержки русского языка через setlocale" - setlocale ничего подобного не делает. Используйте библиотеку ICU. – user7860670 Feb 18 '24 at 10:54

0 Answers0