У меня есть файл с именем 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();
Может кто-нибудь объяснить, почему это не работает для меня?
Ваш исходный код даже не компилируется, потому что 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
Ваш внутренний 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';
std::istringstream
. Поиск StackOverflow для "C ++ istringstream getline".