指向 >> 运算符的 fstream 问题的指针?
Pointer to an fstream issue with >> operator?
我正在尝试使用文件流来读取输入,当我在 classes 之间传输文件时,我需要能够维护一个指向文件的指针。这是我正在尝试做的事情的粗略概述:
class A {
friend class B;
public:
void somefunction();
private:
fstream o;
B b;
};
class B {
fstream * in;
public:
void input();
void modify(fstream *);
};
这是我尝试使用的两个 classes 的简单表示。我有一个像这样修改 fstream 的函数:
void A::somefunction() {
B.modify(o);
}
void B::modify(fstream * o) {
this -> in = o;
}
这里我传递了另一个 fstream 以便 class B 现在维护一个指向该文件的指针。但是,当我尝试使用它读取输入时,我失败了:
void B::input() {
while (*in >> object) {
cout << object << endl;
}
}
该语句的计算结果为 false,while 循环不执行。我想知道这是否是流的问题,但我不确定。有人有什么建议吗?
编辑:
B b;
b.modify(o);
我想将 class A 中的 fstream o
传递给 class B。我将 class A 中的 fstream * in
设置为 [= class B 中的 14=]。我忘了添加 fstream o 正在从文件中读取,我想基本上 "transfer" 流到 class B 以便它可以读取文件。
首先,streams are not copyable(它们的拷贝构造函数在pre-C++11中是私有的,在C++11和C++14中被删除)。如果你有一个 fstream
类型的成员,你需要将 std::move
加入其中(使用 C++11 或更高版本)。如果你不想使用(不能使用)C++11,那么你需要传递指针(或引用)。这是使用指针的一种方法:
#include <iostream>
#include <fstream>
class A
{
std::fstream* o; // pointer to fstream, not fstream
public:
A(std::fstream* o): o(o) {}
std::fstream* get_fstream() const
{
return o;
}
};
class B
{
std::fstream* in;
public:
void modify(std::fstream* o)
{
this -> in = o;
}
void input()
{
std::string object;
while (*in >> object) {
std::cout << object << std::endl;
}
}
};
int main()
{
std::fstream* ifile = new std::fstream("test.txt");
A a(ifile);
B b;
b.modify(a.get_fstream());
b.input();
delete ifile;
}
我更喜欢指针而不是引用,因为引用必须被初始化并且以后不能更改。
我正在尝试使用文件流来读取输入,当我在 classes 之间传输文件时,我需要能够维护一个指向文件的指针。这是我正在尝试做的事情的粗略概述:
class A {
friend class B;
public:
void somefunction();
private:
fstream o;
B b;
};
class B {
fstream * in;
public:
void input();
void modify(fstream *);
};
这是我尝试使用的两个 classes 的简单表示。我有一个像这样修改 fstream 的函数:
void A::somefunction() {
B.modify(o);
}
void B::modify(fstream * o) {
this -> in = o;
}
这里我传递了另一个 fstream 以便 class B 现在维护一个指向该文件的指针。但是,当我尝试使用它读取输入时,我失败了:
void B::input() {
while (*in >> object) {
cout << object << endl;
}
}
该语句的计算结果为 false,while 循环不执行。我想知道这是否是流的问题,但我不确定。有人有什么建议吗?
编辑:
B b;
b.modify(o);
我想将 class A 中的 fstream o
传递给 class B。我将 class A 中的 fstream * in
设置为 [= class B 中的 14=]。我忘了添加 fstream o 正在从文件中读取,我想基本上 "transfer" 流到 class B 以便它可以读取文件。
首先,streams are not copyable(它们的拷贝构造函数在pre-C++11中是私有的,在C++11和C++14中被删除)。如果你有一个 fstream
类型的成员,你需要将 std::move
加入其中(使用 C++11 或更高版本)。如果你不想使用(不能使用)C++11,那么你需要传递指针(或引用)。这是使用指针的一种方法:
#include <iostream>
#include <fstream>
class A
{
std::fstream* o; // pointer to fstream, not fstream
public:
A(std::fstream* o): o(o) {}
std::fstream* get_fstream() const
{
return o;
}
};
class B
{
std::fstream* in;
public:
void modify(std::fstream* o)
{
this -> in = o;
}
void input()
{
std::string object;
while (*in >> object) {
std::cout << object << std::endl;
}
}
};
int main()
{
std::fstream* ifile = new std::fstream("test.txt");
A a(ifile);
B b;
b.modify(a.get_fstream());
b.input();
delete ifile;
}
我更喜欢指针而不是引用,因为引用必须被初始化并且以后不能更改。