我有两个文件,其中一个我创建了简单的类:
#include <iostream>
#include <fstream>
#include <string>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include <unistd.h>
class myclass{
protected:
int ima,imb,imc,tm;
fstream file;
public:
void creafile(string filename){
string dir;
dir = "txtfile/";
file.open((dir + filename).c_str(), ios::in | ios::out);
if(file.fail()){
// file.open(filename, ios::in | ios::out);
//if(file.fail())
cout<<"Error when creating the file"<<endl;
exit(1);
}
file.close();
}}
我的主文件名为data.cpp,只包含以下代码:
using namespace std;
#include "mylib.h"
int main() {
myclass dat,hi;
dat.creafile("creatorfile.txt");
return 0;
}
我的问题是,在创建文件时调用creafile
错误时,我总是收到错误消息。为了做一个更简单的测试用例,我还尝试了以下代码:
file.open("myfile.txt");
if(!file){
cout<<"Error when creating the file"<<endl;
exit(1);
}
file.close();
但是,在创建文件时,它仍会出现错误错误。我已尝试使用所有标志ios::app ios::in ios::out
等,但没有任何变化。我有500GB的可用空间,并运行Windows 7。
答案 0 :(得分:2)
根据the reference,ios::in | ios::out
std::ios_base::openmode
配置会在文件不存在时生成错误,因此您赢了创建新的一个人。
我不知道你为什么要使用会员std::fstream
,createfile
可能只是一个不会改变任何对象的static
函数。你甚至在事后关闭它!它会使用本地 std::ofstream
创建一个文件,其开放模式为std::ios_base::out
,将创建文件:
std::ofstream ofs(dir + filename); // .c_str() not needed since C++11
答案 1 :(得分:1)
第1点:如果文件不存在,则无法打开。幸运的是,你可能不想。同时读取和写入相同的文件是有问题的,几乎总是一个坏主意。直到你知道你必须同时读写,
如果你有一个非常大的文件,你就无法存储在内存中,
goto
),否则继续第2点:您已经创建了txtfile文件夹,但是您是否在正确的位置创建了它?您的开发环境(包括conio.h建议Visual Studio或古董)可能无法从您认为正在运行的程序运行您的程序。
将其添加到main中的代码中:
char buf[4097]; // really big buffer
getcwd(buf, (int)sizeof(buf)); // get working directory
std::cout << buf << std::endl; // print the working directory
如果打印出的文件夹不是您创建txtfile文件夹的位置,则无法打开该文件。如果您想自动创建文件夹,请阅读:How to make a folder/directory
第3点:exit(1);
是一个非常大的锤子。这是一个令人讨厌的锤子。 Read more here.如果没有真正的理由,请不要使用它。在这种情况下,return
足以让您退出函数,如果向函数添加返回值,main
可以测试返回值以查看它是否应该继续或返回。或者你可以抛出异常。