Как упомянул Дэвид Н., fstreams не генерируют по умолчанию, когда файл не открывается, или поток в какой-то момент переходит в плохое состояние во время записи.Вы можете сделать так, чтобы они выдавали ошибку, устанавливая флаг ofstream :: exceptions в 'ofstream :: failbit |ofstream :: badbit.Вы можете найти более подробную информацию о маске исключения здесь:
http://www.cplusplus.com/reference/iostream/ios/exceptions/
Хорошей практикой является установка маски исключения для сбоя, поскольку а) она избегает условий гонки и б) требует ошибоки c) разрешает автоматическое разматывание стека, что часто удобно в больших программах.
Во-вторых, в этом цикле:
while (inputFile)
{
...
}
Условие, которое вы должны проверить, - это inputFile.EOF ().Тем не менее, я бы посоветовал вам сделать так: «Путь C ++»:
#include <iostream>
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
float fValue;
ifstream inputFile;
ofstream outputFile;
inputFile.open("input");
outputFile.open("output");
// EDIT: this is optional, but recommended
inputFile.exceptions(ifstream::badbit | ifstream::failbit);
outputFile.exceptions(ofstream::badbit | ofstream::failbit);
copy(istream_iterator<double>(inputFile)
, istream_iterator<double>()
, ostream_iterator<double>(outputFile, ", "));
/*
// EDIT: you can also check the status manually, but it looks more like C code:
if(inputFile.bad() || outputFile.bad())
return 1;
*/
outputFile.close();
inputFile.close();
cin.ignore();
return 0;
}
Обратите внимание на использование итераторов и алгоритма std :: copy () вместо чтения непосредственно из потока.Если вы хотите распечатать содержимое файла напрямую в std :: cout, то вы можете сделать это:
copy(istream_iterator<char>(file), istream_iterator<char>(), ostream_iterator<char>(cout));
Обратите внимание, что по умолчанию istream_iterators пропускает пробелы, поэтому вы должны установить file >> noskipws
чтобы предотвратить это.
HTH!
Gred