Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用fstream指针对文件进行操作?_C++_Fstream - Fatal编程技术网

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

C++ 如何使用fstream指针对文件进行操作?,c++,fstream,C++,Fstream,我想使用一些抽象来操作流,因此我想使用fstream*而不是ifstream和ofstream。我试图做类似的事情,但会导致访问违规: char* text= "test"; fstream* o = new fstream(); o = &fstream("name.txt"); o->write(text, 4); o->close(); 我如何修复它,或者使用另一个想法 我想在这种情况下使用指针(您可以在这里查看更多一般信息) 更改后,现在看起来如下所示: c

我想使用一些抽象来操作流,因此我想使用fstream*而不是ifstream和ofstream。我试图做类似的事情,但会导致访问违规:

char* text= "test"; 
fstream* o = new fstream(); 
o = &fstream("name.txt"); 
o->write(text, 4); 
o->close();
我如何修复它,或者使用另一个想法

我想在这种情况下使用指针(您可以在这里查看更多一般信息)

更改后,现在看起来如下所示:

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;
}
主要内容:

虽然我找不到文件,但这段代码似乎仍在工作。我已选中,当前目录指向正确(ProjectName/Debug)


我检查了它,并将fstream更改为ofstream将正常工作,我可以找到该文件。但由于我想实现某种程度的抽象和,我想使用fstream。我怎样才能修好它

此代码将给您一个错误,因为您无法获取临时对象的地址,就像您使用
&fstream(“name.txt”)
所做的那样

另外,请注意,从字符串文字到
char*
的转换已被弃用,并且在C++11中无效。改用
常量字符*

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

几乎不需要有指向
fstream
的指针。只要这样做:

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

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

此代码将给您一个错误,而不会导致访问冲突。我看到三个编译器错误。为什么我们在这里使用指针?这样做没有任何好处。代码编译时没有错误。Adre:在这个简单的示例中,使用指针没有任何意义。但一般来说,如果我像你说的那样使用fstream o并在类的头文件中初始化它,我会使用pointer。然后在我的类中的Open(char*path)中尝试执行o=fstream(path),这将导致编译错误。这就是为什么我想用pointer@SebastianCygert您应该只执行
o.open(path)
。它看起来很有效(没有错误),但实际上在目录中没有创建任何文件。因为它是用您的解决方案fstream o(“name.txt”)创建的;o、 写(正文,4);o、 close()@SebastianCygert我相信您可能看到了Visual Studio bug。尝试
file.open(路径,std::fstream::in | std::fstream::out | std::fstream::trunc)尽管对于给定的示例,答案在技术上是正确的,但它并没有回答如何使用new实例化流对象的问题。
plik->write(napis, 6);
std::ofstream o("name.txt");
o.write(napis, 4);
o.close();