Как читать в двойном файле в С++

Как вы читаете в двойном файле на С++?

Я знаю, что для целых чисел вы можете использовать getline(), а затем atoi, но я не нахожу массив для двойной функции. Что доступно для чтения в двойниках или преобразования массива символов в двойное?


person Josh Curren    schedule 10.04.2010    source источник
comment
почему бы не прочитать его как char* и не использовать sscanf?   -  person Cam    schedule 11.04.2010
comment
@incrediman: Потому что, если вы уже используете стандартные потоки, вы, вероятно, не хотите иметь дело с головными болями функций C.   -  person Billy ONeal    schedule 11.04.2010
comment
Если вы хотите настаивать на выполнении getline(), а затем atoi(), вы можете заменить atoi() на atof(), и все будет в порядке. Но метод @R Samuel Klatchko должен хорошо работать как для двойных, так и для целых чисел.   -  person Chris Lutz    schedule 11.04.2010


Ответы (4)


Вы можете использовать извлечение потока:

std::ifstream ifs(...);
double d;
ifs >> d;

Эта работа предусматривала, что кроме пробелов, следующие данные в потоке должны быть двойными в текстовом представлении.

После извлечения вы можете проверить состояние потока на наличие ошибок:

ifs >> d;
if (!ifs)
{
    // the double extraction failed
}
person R Samuel Klatchko    schedule 10.04.2010
comment
Это не правильно. Проверьте поток на предмет сбоя (.fail(), который немного отличается от .good(), который эквивалентен .rdstate() == 0). Используйте if (!(ifs >> d)) {/*failed*/} или ifs >> d; if (!ifs) {/*..*/} или (как правило, более полезно) if (ifs >> d) {/*use d*/} else {/*failed*/}. - person ; 11.04.2010
comment
(Использование !stream аналогично stream.fail(), использование bool(stream) аналогично !stream.fail().) - person ; 11.04.2010

Не рассматривайте возможность использования atof() или любой из функций ato.., так как они не позволяют диагностировать ошибки. Взгляните на strtod и strtol. Или используйте операторы извлечения потока.

person Community    schedule 10.04.2010
comment
@sblom Вы возражаете против грамматики? Если да, предложите улучшения. - person ; 11.04.2010
comment
В других новостях, @Neil, я только что заметил, что ты лучший ответчик на С++ за все время с накопленным 1337 ответами! ПОБЕДИТЬ! stackoverflow.com/questions/ - person wilhelmtell; 11.04.2010

Мне интересно, нужно ли быть осторожным с настройками локали (например, локаль может использовать запятую вместо точки для разделения десятичной части) или всегда ли строковые потоки по умолчанию используют некоторую стандартную нотацию «C локаль»?

person Johan Boulé    schedule 11.04.2010

Вы можете использовать istringstream. Например, вот toDouble и toInt:

double toDouble(string s) {
  double r = 0;
  istringstream ss(s);
  ss >> r;
  return r;
}

int toInt(string s) {
  int r=0;
  istringstream ss(s);
  ss >> r;
  return r;
}
person Mohamed Mansour    schedule 10.04.2010
comment
Это уже существует в boost, в гораздо лучшей форме, включая проверку ошибок, как lexical_cast. - person ; 11.04.2010
comment
@ Роджер Пейт: Да, это так. Это полезно в тех случаях, когда вы не можете использовать boost. - person Billy ONeal; 11.04.2010
comment
@Billy: это не более полезно, чем atof, что Нил правильно указывает, следует избегать (если только вы еще не проверили ввод, но здесь это неверно). - person ; 11.04.2010
comment
Это не отвечает на вопрос. - person wilhelmtell; 11.04.2010
comment
(@Billy: Поскольку вы получили загадочное отрицательное голосование за свой теперь удаленный ответ, я чувствую себя обязанным сказать, что это был не я, и я не отрицал здесь какой-либо ответ за то, что просто предложил atof или пропустил обработку ошибок. голосов за последние 18 часов, и мои следующие 30 уже добавлены в закладки на 0:01 по Гринвичу. :P) - person ; 11.04.2010
comment
@ Роджер Пейт: Нет проблем. Причина, по которой я удалил это, заключается в том, что я рассмотрел ваш комментарий и согласен;) - person Billy ONeal; 11.04.2010