Я использую getline для извлечения строк из текстового документа, как мне преобразовать эти строки в тип int для toupper
Парню, который сказал, что это дубликат: вы утверждаете, что это дубликат и что на все вопросы здесь даны ответы, но ни один из ответов в этом посте не является приемлемым, или объясняете, что делать в случае преобразования строк getline в целые числа, Я не могу использовать transform, и справочные страницы cpp для toupper ничего не объясняют, касаясь моей конкретной проблемы. Они работают со строками, а не со строками. Но вы, кажется, уверены в обратном, поэтому объясните, пожалуйста, почему?
Я знаю, это звучит маловероятно, но я два дня гуглял, как конкретно это сделать: превратить много строк ввода строки из цикла while getline в целые числа, чтобы я мог использовать для них toupper. Я знаю о std::transform, но я не хочу его использовать, он не преподается в нашем учебнике Тони Гаддиса "Начинаем с C++", и мой инструктор сказал, что transform действительно предназначена только для профессиональных программистов и что он не учит этому ни в одном из своих классов, и что это все равно смущает меня.
Ниже приведены инструкции для моей программы. Но позвольте мне заметить: я ни в коем случае не хочу обманывать, я хочу понимания, так как я хочу быть программистом мирового класса. Я только добавляю инструкции, чтобы дать дальнейшее разъяснение того, для чего я пытаюсь сделать это.
Ваша программа должна:
Читайте каждую строку файла, независимо от того, сколько строк.
Вывести соответствующее сообщение, если файл letter_count.txt не найден.
Считайте варианты как в нижнем, так и в верхнем регистре как один и тот же символ. В тексте,
"Это время для всех хороших людей прийти на помощь своей стране", буква Т встречается 7 раз.
Игнорируйте не алфавитные символы, такие как пробел, точка, апостроф и т. Д.
Показать наиболее распространенную букву в файле и его количество вхождений.
Показать наименее распространенную букву в файле и его количество вхождений.
Если есть привязка к самой (или наименьшей) общей букве, программе нужно отобразить только одну из букв, которая была наиболее (или наименьшей) общей.
Для этой программы может использоваться только строковый класс C++. C-строки или функции C-строки не могут использоваться для этого назначения.
Ваша программа должна включать как минимум одну функцию, которая использует одну или несколько ссылочных переменных в качестве параметров.
Для этой программы нельзя использовать глобальные переменные.
Я пробовал.get вместо getline, что облегчило бы переход, но мой инструктор сказал, что это неэффективно, поэтому я бы не стал. Я прочитал более 10 сообщений на форуме cplusplus.com и вдвое больше сообщений от stackru, но не нашел ответа, связанного с кодом C++ для начинающих. Обычно это было связано с использованием преобразования или другого продвинутого "простого способа" кода, который я не мог обернуть.
#include <iostream>
#include <fstream>
#include <string>
#include <cctype>
using namespace std;
int main()
{
ifstream textFile;
string text;
//char upperText;
int upperText;
if (ifstream textFile{ "letter_count.txt" })
{
while (getline(textFile, text))
{
upperText = toupper(text);
//cout << text << endl;
cout << upperText << endl;
}
}
else
{
cout << "ERROR: Cannot open file. \n";
}
//cout << "The most common letter is " " with " " occurances. \n";
//cout << "The least common letter is " " with " " occurances. \n";
system("pause");
}
Я ценю ваше время и терпение здесь, я благодарен за вашу помощь, спасибо, ребята.:)
2 ответа
toupper
изменяет только один символ за раз. Это где std::transform
становится полезным. Что так смущает std::transform(text.begin(), text.end(), toupper);
это хороший вопрос для себя, но то, что вы хотите в его отсутствие, это цикл, который вызывает toupper
на каждом персонаже в text
, например:
for (auto & ch: text)
{
ch = toupper(ch);
}
Изменить: на основе диапазона for
циклы появились в C++ 2011 Standard Edition. В старые времена вам приходилось делать что-то более похожее
for (string::iterator ch = text.begin();
ch != text.end();
++ch)
{
*ch = toupper(*ch);
}
или же
for (string::size_type i = 0;
i < text.length();
i++)
{
text[i] = toupper(text[i]);
}
У обоих гораздо больше возможностей для ошибок, поэтому, если вы можете использовать диапазон, основанный на for
, сделай это и не оглядывайся.
Замещать
upperText = toupper(text);
С
std::transform(text.begin(),text.end(),text.begin(), std::toupper);
upperText = text;
Затем добавьте "#include" в начало файла