我正在编写一个小型/ beta测试程序,该程序将用于我更大的项目程序中。它向用户请求输入文件名(IE data.txt)并创建名为filename.out(IE data.out)的输出文件。我尝试了一个简单的outFile<< “在这打字”;尝试一下,但它不会创建输出文件。我确定我在这里搞砸了一些简单的东西,但我无法弄清楚是什么。
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
//Global variables
ifstream inFile;
ofstream outFile;
void main()
{
// Requests user for input filename
string inputFile;
cout << "Enter File Name: ";
cin >> inputFile;
string outputFile = inputFile.substr(0, inputFile.find_last_of('.')) + ".out";
// Opens both inputFile and outputFile
inFile.open(inputFile.c_str(), ios::in);
outFile.open(outputFile.c_str(), ios::in);
// Checks for input file
if (!inFile)
{
cout << "Unable to open file" << endl;
exit(1);
}
outFile << "Hello world!";
inFile.close();
outFile.close();
}
答案 0 :(得分:9)
因为您正在尝试打开文件进行阅读:
outFile.open(outputFile.c_str(), ios::in);
改为使用ios::out
。
答案 1 :(得分:3)
为什么要将这些流设为全局变量而不是本地变量?在C ++中,通常首选尽可能晚地构造对象。如果这样做,您可以使用所有信息在构造函数中打开流,这可以采用与open()
成员函数相同的参数。
std::ifstream
和std::ofstream
之间的一个区别是他们的open()
成员函数和构造函数应用了不同的默认打开模式。 in
为std::ifstream
,out
为std::ofstream
。你总是可以覆盖这些,但这在一定程度上会破坏使用这些流的原因。您也可以使用std::fstream
。为此,您始终必须提供打开模式。如果您使用的是std::ifstream
和std::ofstream
,请跳过打开模式。下面是使用构造函数而不是open()
成员函数时的外观(它与后者看起来几乎相同):
std::ifstream inFile(inputFile.c_str());
std::ofstream outFile(outputFile.c_str());
它是int main()
,即使某些编译器允许void
。
I have strong objections to using directives。但是这些反对意见并没有像本答复中列出的其他意见那样广泛分享。