Преобразование каждого элемента строки файла в целое число

0

У меня есть файл с именем numbers.txt с несколькими строками чисел. Я просто пытаюсь преобразовать каждое число в целое и распечатать его.

if (numbers.is_open()) {
    while (std::getline(numbers, line)) {
        for (int i = 0; i < line.length(); i++) {
            number = atoi((line.at(i)).c_str());
            std::cout << number;
        }
    }
    numbers.close();

Может кто-нибудь объяснить, почему это не работает для меня?

  • 0
    Я предлагаю использовать std::istringstream . Поиск StackOverflow для "C ++ istringstream getline".
Теги:
string
file

2 ответа

0
Лучший ответ

Ваш исходный код даже не компилируется, потому что std :: string :: at (size_t pos) не возвращает std::string; он возвращает примитивный характер. Символы не имеют методов - метода char::c_str() !

Если ваш комментарий выше правильно и вы хотите рассматривать отдельные символы как цифры, я предлагаю следующее:

if (numbers.is_open())
{
    while (std::getline(numbers, line))
    {
        auto i = line.begin(), e = line.end(); // std::string::const_iterator
        for (; i != e; ++i)
        {
            if (std::isdigit(*i))
            {
                // Since we know *i, which is of type char, is in the range of
                // characters '0' .. '9', and we know they are contiguous, we
                // can subtract the low character in the range, '0', to get the
                // offset between *i and '0', which is the same as calculating
                // which digit *i represents.
                number = static_cast<int>(*i - '0');
                std::cout << number;
            }
            else throw "not a digit";
        } // for
    } // while
    numbers.close();
} // if
0

Ваш внутренний for итерации цикла по каждому символу в строке, которая является ненужной, если предположить, что вы хотите, чтобы рассматривать всю линию как один номер. Функция atoi() работает на целой c-строке, а не только на одном символе. Таким образом, вы можете избавиться от цикла for и .at(i) и просто сделать что-то вроде этого:

if (numbers.is_open()) {
    while (std::getline(numbers, line)) {                                     
        int number = atoi(line.c_str());
        std::cout << number << std::endl;                            
    }
    numbers.close();
  }
}

EDIT (комментарий # 0)

Чтобы интерпретировать каждый символ в отдельности, вы можете сделать это (хотя могут быть более чистые реализации):

if (numbers.is_open()) {
    while (std::getline(numbers, line)) {
      for (int i = 0; i < line.length(); i++) {                                                     
        int number = atoi(line.substr(i, 1).c_str());
        std::cout << number << endl;
        }
    }
    numbers.close();
  }

Если вы можете гарантировать, что в файле будут только цифры, вы также можете выполнить преобразование следующим образом:

int number = line.at(i) - '0';
  • 0
    Я хочу рассматривать каждого персонажа как одно число.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню