我想使用一些抽象操作流,因此我想使用fstream *而不是ifstream和ofstream。我试着这样做但是会导致访问违规:
char* text= "test";
fstream* o = new fstream();
o = &fstream("name.txt");
o->write(text, 4);
o->close();
我该如何修复它,或者使用其他想法?
我想在这种情况下使用指针(你可以在这里查看更多一般信息)How to implement my own IO file API in C++
更改后,它现在看起来像这样:
class GIO_Persistent_File_System : public GIO_CORE
{
public:
GIO_Persistent_File_System(void);
int open(char*, int);
int close();
void write(char* s, int size);
void read(char* s, int size);
public:
~GIO_Persistent_File_System(void);
private:
fstream file;
};
int GIO_Persistent_File_System::open(char* path, int mode){
file.open(path);
return 0;
}
int GIO_Persistent_File_System::close(){
file.close();
return 0;
}
void GIO_Persistent_File_System::write(char* s, int size){
file.write(s, size);
return;
}
void GIO_Persistent_File_System::read(char* s, int size){
file.read(s, size);
return;
}
MAIN:
GIO_CORE* plik = new GIO_Persistent_File_System();
char* test = new char[10];
char* napis = "testgs";
plik->open("name.txt", OPEN_MODE);
plik->write(napis, 2);
//plik->read(test,2);
plik->close();
此代码似乎正在工作我找不到文件。我检查了当前目录是否正确指向(ProjectName / Debug)
我检查过它并且将fstream更改为ofstream将正常工作,我可以找到该文件。但是因为我想要达到某种程度的抽象而且我想使用fstream 。我该如何解决?
答案 0 :(得分:8)
此代码会给您一个错误,因为您无法获取临时对象的地址,就像使用&fstream("name.txt")
一样。
error: taking address of temporary
另请注意,已弃用从字符串文字到char*
的转换,并且在C ++ 11中无效。改为使用const char*
:
const char* text = "test";
尽管如此,让我们来看看你尝试做什么。首先,您正在动态分配fstream
并初始化指向该对象的指针:
fstream* o = new fstream();
然后在下一行中,使用fstream("name.txt")
创建一个临时对象,然后获取其地址并将其分配给o
(这会产生错误,如我们所见)。现在您将丢失对动态分配的fstream
的任何访问权限,而是让o
指向现在已销毁的临时对象。
取消引用该指针(使用o->
)将为您提供未定义的行为。
你这太复杂了。您根本不需要动态分配fstream
对象或使用指针。相反,尝试:
fstream o("name.txt");
o.write(text, 4);
o.close();
使用更新的代码,问题是你写的是0字节:
plik->write(napis, 0);
也许你的意思是:
plik->write(napis, 6);
答案 1 :(得分:2)
几乎不需要指针到fstream
。就这样做:
std::ofstream o("name.txt");
o.write(napis, 4);
o.close();
请注意,o
在超出范围时也会关闭,因此您甚至不必致电close()
。