- Изучая классы, работу с ними, а также работу с чтением и записью файлов столкнулся с такой проблемой, что при чтении из txt файла в переменную типа string пытаюсь изменить все заглавные буквы с помощью алгоритма transform() и метода tolower. В моей ситуации это почему-то не работает, пробовал писать более простые отдельные конструкции в основном теле с тем же алгоритмом и всё работает корректно, даже с русским языком, но используя в классе, получается так, что заглавные буквы не меняются на строчные.
- Также решив считать количество символов из файла столкнулся с тем, что различные методы выдают лишь объём переменной в байтах, зная, что UTF-8 кодируется, как от 1, так и до 4 байт на символ, задался вопросом, а как можно получить именно количество символов, а не объём? Тип данных и работа с wstring не подходит, так как использую метод getline.
- В конце хотел бы дополнить, что при использовании в основном теле программы (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;
}
};
doubleне предлагать... Можно, конечно, но через одно неприличное место. А вообще см. https://ru.stackoverflow.com/q/459154/195342 – Harry Feb 18 '24 at 06:51#define UTF8_LTAG (0x3a55ULL << 48)) / При перекодировке заглавных в строчные (если ограничиться русскими буквами и ascii) придется отдельно смотреть наёЁ– avp Feb 18 '24 at 10:48setlocaleничего подобного не делает. Используйте библиотеку ICU. – user7860670 Feb 18 '24 at 10:54