如何使用fstream指针对文件进行操作?

时间:2013-03-28 14:10:42

标签: c++ fstream

我想使用一些抽象操作流,因此我想使用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 。我该如何解决?

2 个答案:

答案 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()