3

入力ファイルから情報を読み取り、そのデータを出力ファイルに書き込む方法を理解しようとしています。ファイルから読み取り、その内容を表示する方法は理解していますが、ファイルに書き込む方法や内容を表示する方法は理解していません。私のプログラムは正常に動作しますが、出力 txt ファイルを確認すると、何もありません! 私は何が間違っているのでしょうか?入力ファイルには 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

4 に答える 4

5

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();

牛が帰ってくるまで、まだ何の出力も得られません。

于 2011-09-30T18:28:01.720 に答える
2

David N. が述べたように、ファイルが開かない場合、または書き込み中のある時点でストリームが悪い状態になった場合、デフォルトでは fstream はスローされません。ofstream::exceptions フラグを 'ofstream::failbit | ofstream::badbit'. 例外マスクの詳細については、次を参照してください。

http://www.cplusplus.com/reference/iostream/ios/exceptions/

a) 競合状態を回避し、b) エラーを処理する必要があり、c) 大規模なプログラムで便利なスタックの自動巻き戻しを許可するため、失敗の例外マスクを設定することをお勧めします。

次に、このループで:

while (inputFile) 
{
...
}

チェックする必要がある条件は、inputFile.eof() です。ただし、次の「The C++ Way」を実行することをお勧めします。

#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ため、これを防ぐために設定する必要があることに注意してください。

チッ!

グレッド

于 2011-10-02T14:04:53.833 に答える
1

アプリケーションを終了する前に、バッファをファイルにフラッシュするために出力ファイルを閉じる必要があります。

于 2011-09-30T18:20:18.637 に答える
1

このコードは、何かをファイルに保存する必要があるように見えます。論理はすべて間違っていますが、何かがあるはずです。ストリームの状態を確認します。

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;
    }
}
于 2011-09-30T18:27:18.587 に答える