2

我想使用一些抽象对流进行操作,因此我想使用 fstream* 而不是 ifstream 和 ofstream。我试图这样做,但会导致访问冲突:

char* text= "test"; 
fstream* o = new fstream(); 
o = &fstream("name.txt"); 
o->write(text, 4); 
o->close();

我该如何解决它,或使用其他想法?

我想在这种情况下使用指针(您可以在这里查看更多一般信息)如何在 C++ 中实现我自己的 IO 文件 API

更改后现在看起来像这样:

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;
}

主要的:

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。我该如何解决?

4

2 回答 2

7

这段代码会给你一个错误,因为你不能像使用&fstream("name.txt").

error: taking address of temporary

另外,请注意,从字符串文字到 a 的转换char*已被弃用,并且在 C++11 中无效。使用 aconst 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);
于 2013-03-28T14:11:59.667 回答
2

几乎不需要指向. fstream只需这样做:

std::ofstream o("name.txt");
o.write(napis, 4);
o.close();

请注意,o当它超出范围时它也会关闭,因此您通常甚至不必调用close().

于 2013-03-28T14:13:41.530 回答