Я использую getline для извлечения строк из текстового документа, как мне преобразовать эти строки в тип int для toupper

Парню, который сказал, что это дубликат: вы утверждаете, что это дубликат и что на все вопросы здесь даны ответы, но ни один из ответов в этом посте не является приемлемым, или объясняете, что делать в случае преобразования строк getline в целые числа, Я не могу использовать transform, и справочные страницы cpp для toupper ничего не объясняют, касаясь моей конкретной проблемы. Они работают со строками, а не со строками. Но вы, кажется, уверены в обратном, поэтому объясните, пожалуйста, почему?

Я знаю, это звучит маловероятно, но я два дня гуглял, как конкретно это сделать: превратить много строк ввода строки из цикла while getline в целые числа, чтобы я мог использовать для них toupper. Я знаю о std::transform, но я не хочу его использовать, он не преподается в нашем учебнике Тони Гаддиса "Начинаем с C++", и мой инструктор сказал, что transform действительно предназначена только для профессиональных программистов и что он не учит этому ни в одном из своих классов, и что это все равно смущает меня.

Ниже приведены инструкции для моей программы. Но позвольте мне заметить: я ни в коем случае не хочу обманывать, я хочу понимания, так как я хочу быть программистом мирового класса. Я только добавляю инструкции, чтобы дать дальнейшее разъяснение того, для чего я пытаюсь сделать это.

Ваша программа должна:

  1. Читайте каждую строку файла, независимо от того, сколько строк.

  2. Вывести соответствующее сообщение, если файл letter_count.txt не найден.

  3. Считайте варианты как в нижнем, так и в верхнем регистре как один и тот же символ. В тексте,

"Это время для всех хороших людей прийти на помощь своей стране", буква Т встречается 7 раз.

  1. Игнорируйте не алфавитные символы, такие как пробел, точка, апостроф и т. Д.

  2. Показать наиболее распространенную букву в файле и его количество вхождений.

  3. Показать наименее распространенную букву в файле и его количество вхождений.

  4. Если есть привязка к самой (или наименьшей) общей букве, программе нужно отобразить только одну из букв, которая была наиболее (или наименьшей) общей.

  5. Для этой программы может использоваться только строковый класс C++. C-строки или функции C-строки не могут использоваться для этого назначения.

  6. Ваша программа должна включать как минимум одну функцию, которая использует одну или несколько ссылочных переменных в качестве параметров.

  7. Для этой программы нельзя использовать глобальные переменные.

Я пробовал.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" в начало файла

Другие вопросы по тегам