Следующий код предназначен для получения всех плавающих чисел для вычисления из файла «float.txt». Проблема в том, что плавающие числа содержат ненужную информацию между ними.
пример файла:
23.5 aujsaN8.2<:::32
После получения первой плавающей запятой цикл while никогда не заканчивается, программа больше не получает никакой информации из файла. пожалуйста помоги.
int main()
{
float num;
ifstream input("float.txt");
input >> num;
while (!(input.eof()))
{
input >> num;
}
input.close();
return 0;
}
Вы могли бы сделать что-то вроде этого:
decltype(input)::Traits::int_type c;
while ((c = input.peek()) != decltype(input)::Traits::eof())
{
if (std::isdigit(c))
{
input >> num;
... use num ...
}
else
input.get();
}
Идея здесь заключается в peek
для следующего символа, и если это цифра, то мы знаем >>
потоковое к double
удастся, иначе мы на самом деле get()
символ для удаления его из входного потока.
Это становится сложнее, если вам нужно извлечь отрицательные числа (подсказка: один из способов — используйте bool
отслеживать, если последнее значение c
видел был -
то есть if (the_bool) num = -num;
Перед использованием num
). В то время как код выше обрабатывает, например, X0.23X
-> 0,23, вам может понадобиться, а может и не понадобиться X.23X
— если так, проверьте .
затем посмотрите, является ли следующий символ цифрой … хитрая вещь в том, что поиск цифры означает, что вы уже употребили .
так что его там не будет input >> num
… ты можешь попробовать input.putback('.')
но я не уверен, что это стандартно требуется для работы, когда вы потребляете персонажа, а затем заглядываете — вам придется проверить ….
Смотри, я не знаю, как оператор ввода >> Num; работает, я никогда не использовал их, вместо этого я сделаю это, чтобы извлечь поплавки из указанного вами файла.
float floats=0;
char string[100], ch;
while (file.get(ch)!=' ')
{
string[i]=ch;
i++;
}
string[i]='\0';
floats=atof(string);
Эта программа просто копирует символы до тех пор, пока не будет найдено » (Пробел), как показано в файле u, затем функция aotf () преобразует строку в число с плавающей запятой.
Это ответ на ваш вопрос ??, если да, то, пожалуйста, проголосуйте +1, и если какой-либо вопрос вы можете мне задать, я обязательно помогу вам …
это работает
// g++ -o parse_float_file parse_float_file.cpp -std=c++11
#include <iostream>
#include <fstream>
#include <string>
int main() {
float curr_number;
std::ifstream inFile("float.txt");
std::string line;
while(getline(inFile, line)) {
try {
curr_number = std::stof(line);
std::cout << "-->" << curr_number << "<--" << std::endl;
} catch (const std::exception &e) {
std::cout << "ERROR - not a float : " << line << std::endl;
}
}
return 0;
}