Почему мой выходной файл пуст в этой простой программе, использующей std :: fstream? - PullRequest
2 голосов
/ 30 сентября 2011

Я пытаюсь понять, как читать информацию из входного файла и записывать эти данные в выходной файл. Я понимаю, как читать из файла и отображать его содержимое, но я НЕ понимаю, как записать в файл или отобразить его содержимое. Моя программа работает нормально, но когда я проверяю свой выходной текстовый файл, в нем ничего нет! Что я могу делать не так? входной файл содержит 3.1415 2.718 1.414.

#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

int main()
{
float fValue;
fstream inputFile;
ofstream outputFile;

inputFile.open("C:\\Users\\David\\Desktop\\inputFile.txt");
outputFile.open("C:\\Users\\David\\Desktop\\outputfile.txt");

cout << fixed << showpoint;
cout << setprecision(3);
cout << "Items in input-file:\t " << "Items in out-put File: " << endl;

inputFile >> fValue;    // gets the fiest value from the input

while (inputFile) // single loop that reads(from inputfile) and writes(to outputfile)    each number at a time.
{
    cout << fValue << endl; // simply prints the numbers for checking.
    outputFile << fValue << ", "; // writes to the output as it reads numbers from the input.
    inputFile >> fValue; // checks next input value in the file
}



outputFile.close();
inputFile.close();


int pause;
cin >> pause;

return 0;
}

Ответы [ 4 ]

3 голосов
/ 30 сентября 2011

В Windows вполне вероятно, что выходной файл открыт с помощью чего-то вроде блокнота, и ваша программа на C ++ не открывает файл для вывода.Если он не может открыть файл, функция ofstream :: open завершится с ошибкой.Вам необходимо проверить состояние файла outputFile после попытки открыть его.Что-то вроде

outputFile.open("C:\\Users\\David\\Desktop\\outputfile.txt");
if (!outputFile) {
  cerr << "can't open output file" << endl;
}

Если состояние outputFile не в порядке, вы можете сделать

outputfile << "foobar";

и

outputfile.flush();

, пока коровы не вернутся домой, а выпо-прежнему не получит никакого вывода.

2 голосов
/ 02 октября 2011

Как упомянул Дэвид Н., 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

1 голос
/ 30 сентября 2011

Код выглядит так, как будто он должен что-то сохранить в файл.Логика неверна, но что-то должно быть там.Проверьте состояние ваших потоков.

cout << fixed << showpoint;
cout << setprecision(3);
cout << "Items in input-file:\t " << "outputFile: " << endl;

while (inputFile >> fValue) 
{
    cout << fValue << endl; // this confirms that the above code read from my text file.
    outputFile << fValue << '\n'
    if (!outputFile) {
        cout << "Error saving to file.\n";
        break;
    }
}
1 голос
/ 30 сентября 2011

Вам нужно закрыть выходной файл для буфера, который будет сброшен в файл до выхода из приложения.

...