【问题标题】:How do I operate on file using fstream pointers?如何使用 fstream 指针对文件进行操作?
【发布时间】:2013-03-28 14:10:41
【问题描述】:

我想使用一些抽象对流进行操作,因此我想使用 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;
}

主要:

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

【问题讨论】:

  • 这段代码会给你一个错误,不会导致访问冲突。
  • 我看到三个编译器错误。
  • 为什么我们在这里使用指针?这样做你并没有得到任何好处。
  • 代码正在编译,没有错误。
  • Adre:在这个简单的例子中,使用指针是没有意义的。但总的来说我想使用指针

标签: c++ fstream


【解决方案1】:

此代码会给您一个错误,因为您不能像使用 &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);

【讨论】:

  • 如果我按照你所说的那样使用 fstream o 并在我的班级的头文件中对其进行初始化。然后在我的类中的 Open(char* path) 中尝试执行 o = fstream(path) 会导致编译错误。这就是为什么我想使用指针
  • @SebastianCygert 你应该只是在做o.open(path)
  • 看起来可以正常工作(没有错误),但实际上没有在目录中创建文件。因为它是使用您的解决方案创建的 fstream o("name.txt"); o.write(文本, 4); o.close();
  • @SebastianCygert 我相信您可能会看到 Visual Studio 错误。试试file.open(path, std::fstream::in | std::fstream::out | std::fstream::trunc);
  • 即使给出的示例的答案在技术上是正确的,但它并没有回答如何使用 new 实例化流对象的问题。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 2012-05-26
    相关资源
    最近更新 更多