运算符 = 不适用于 fstream
Posted
技术标签:
【中文标题】运算符 = 不适用于 fstream【英文标题】:operator = does not work with fstream 【发布时间】:2016-12-04 22:46:43 【问题描述】:我有一个结构
struct myStruct
fstream fp;
char *buffer;
size_t size;
;
我是 C++ 新手,正在尝试编写代码,其中一个线程将从文件读取到缓冲区,而主线程将缓冲区写入另一个文件。代码示例如下:
int main()
pthread tid1;
struct myStruct readArgs;
fstream fileP, fileP2;
fileP.open("/tmp/20MBFile", fstream::in);
fileP2.open("/tmp/trial-file", fstream::out);
char *buffer;
readArgs.fp = fileP;
readArgs.buffer = buffer;
readArgs.size = 1048576;
pthread_create(&tid1, NULL, Read, &readArgs);
pthread_join(tid1, NULL);
fileP2.write(buffer, 1048576);
......
读取函数如下:
void *Read(struct myStruct *readArgs)
readArgs->fp.read(readArgs->buffer, readArgs->size);
pthread_exit(NULL);
然而,当我编译我的代码时,我得到了以下错误:
错误:使用已删除的函数 'std::basic_fstream& std::basic_fstream::operator=(const std::basic_fstream&)' readArgs.fp = 文件P;
与
错误:从 'void* ()(myStruct)' 到 'void* ()(void)' 的无效转换 [-fpermissive] pthread_create(&tid1, NULL, 读取, &readArgs); ^ 在 /usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../../include/c++/4.8.3/x86_64-redhat-linux/bits/gthr 包含的文件中-default.h:35:0, 来自/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../../include/c++/4.8.3/x86_64-redhat-linux/bits/gthr.h: 148, 来自/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../../include/c++/4.8.3/ext/atomicity.h:35, 来自/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../../include/c++/4.8.3/bits/ios_base.h:39, 来自/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../../include/c++/4.8.3/ios:42, 来自/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../../include/c++/4.8.3/ostream:38, 来自 /usr/lib/gcc/x86_64-redhat- .... /usr/include/pthread.h:232:12: 错误:初始化参数 3'int pthread_create(pthread_t*, const pthread_attr_t*, void* ()(void), void*)' [ -fpermissive] extern int pthread_create (pthread_t *__restrict __newthread,
我在这里遗漏了什么吗? 提前致谢!
【问题讨论】:
那么这里有什么解决方案.. 关键字struct
在c++的struct myStruct readArgs;
中是可选的
实际代码中声明的,粘贴时遗漏了。已编辑。
你为什么不直接使用struct
的成员而不是创建无关的局部变量?局部变量bufffer
、fileP
、fileP2
的用途是什么?它们没有任何作用,您的 main
只是在分配给他们的不必要的工作,然后您将它们分配给您的结构的成员。
@bhagyeshdudhediya -- 你不需要那些额外的局部变量。直接使用struct
中的成员变量即可(readArgs.fp.open(...);
) 其次,buffer
是未初始化的指针,你的代码正试图在那个状态下使用它。
【参考方案1】:
找到答案..
1. fstream
- fstream
不能用 = 赋值,但可以移动。 swap()
也因为 gcc
版本而无法正常工作。我有 gcc 版本 4.8.3.x,我猜它不支持 swap()
调用 fstream
。
2. pthread_create()
- 它需要带有签名void *foo(void *)
的函数,所以当你在所需的函数中时,必须传递所需的参数并对其进行类型转换。
在这里我会这样做:
pthread_create(&tid1, NULL, Read, &readArgs);
Read()
函数是:
void *Read(void *args)
myStruct *readA = (myStruct *)args;
....
感谢大家的宝贵时间!
【讨论】:
以上是关于运算符 = 不适用于 fstream的主要内容,如果未能解决你的问题,请参考以下文章