我试图了解如何从输入文件中读取信息并将该数据写入输出文件。我理解如何从文件中读取并显示其内容,但我不明白如何写入文件或显示其内容。我的程序运行正常但是当我检查输出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;
}
答案 0 :(得分:3)
在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();
直到奶牛回家,你仍然无法获得任何产出。
答案 1 :(得分:2)
正如David N.所提到的,当文件无法打开时,fstreams默认不会抛出,或者在写入过程中流在某个时刻进入错误状态。你可以通过将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
才能阻止这种情况。
HTH!
GRED
答案 2 :(得分:1)
您需要关闭输出文件,以便在应用程序退出之前将缓冲区刷新到文件中。
答案 3 :(得分: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;
}
}