(C ) Почему я не могу полагаться на оператор извлечения в качестве итератора?

#c #string #integer #extract #fstream

#c #строка #целое число #извлечение #fstream

Вопрос:

 #include <iostream>
#include <fstream>


int main()
{
    std::ifstream file("input.txt");
    char currentChar;
    int charCount = 0;

    while (file >> currentChar)
    {
        charCount  ;
        if (currentChar == 'a')
        {
            std::cout << charCount;
        }
    }
  

в приведенном выше примере количество символов, которое печатается, очень велико. Если я перемещаю charcount в оператор if и превращаю входные данные в повторения символа ‘a’, он подсчитывается правильно (или будет правильно подсчитывать количество a). Является ли «file>> currentChar» причиной столь значительного увеличения числа символов? И если да, то что он делает? Почему?

Ответ №1:

Это не «массово большой». Вы просто выводите текущее количество каждый раз, когда сталкиваетесь с буквой a , и поскольку вы не включаете никаких пробелов или новых строк, тогда каждое число будет объединено вместе и будет выглядеть как огромное число.

Попробуйте это:

 std::cout << charCount << std::endl;
  

И подумайте о том, чтобы сделать это только один раз после цикла. Если только по какой-то причине вы не хотите показывать все промежуточные значения.

Комментарии:

1. На самом деле вы правы — в моем коде, который я переписал здесь, в stackoverflow, я инициализировал charCount равным нулю. В моем реальном коде он не инициализирован. Я увеличивал неинициализированную переменную, поэтому я получал значения севернее 1 миллиона, даже несмотря на то, что длина входного файла составляла всего несколько сотен символов и в нем была только одна буква «а». Я надеялся распечатать его положение в файле. Я ценю разъяснение, что число не должно быть таким высоким, хотя!

2. Я подозревал, что это тоже могло иметь место, но я должен учитывать сомнения, когда код написан в вопросе. Очень важно, чтобы вы не вводили повторно свою программу, задавая вопросы. Вы должны скопировать / вставить. Вы могли бы дополнительно помочь вашему вопросу, показав фактический результат и указав, сколько a символов было в файле. Это помогло бы выявить проблему, которая затем сделала бы очевидным, что код вашего вопроса не соответствует действительности.