运算符 = 不适用于 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的成员而不是创建无关的局部变量?局部变量buffferfilePfileP2 的用途是什么?它们没有任何作用,您的 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的主要内容,如果未能解决你的问题,请参考以下文章

suppressWarnings() 不适用于管道运算符

前向声明不适用于转换运算符

三元运算符不适用于 lambda 函数

PyMongo 聚合不适用于 $max 运算符

Fortran 派生类型:重载赋值运算符不适用于“参数”属性

扩展运算符不适用于基于 Redux/ES6 的示例