我有一个简单的问题,做一个fwrite,我不知道为什么。
我有:
std::string maLigne;
fwrite(maLigne, sizeof(maLigne), 1, fichierEcrit);
那让我回头:
invalid cast from type 'std::string {aka std::basic_string<char>}' to type 'void*'
我试试:
fwrite(&maLigne, sizeof(maLigne), 1, fichierEcrit);
但文件中没有任何内容,所以我认为这是错误的。
为什么这不起作用?
答案 0 :(得分:4)
它无法正常工作,因为您尝试使用低级C函数将文件写入C ++对象。
如果要使用C fwrite
函数,则必须将指针作为参数传递给数据所在的内存,每个元素的大小,元素的数量和文件句柄。 maLigne
是基于堆栈的对象,而不是指针。 &maLigne
是该对象的地址,但不是数据字符串所在的地址(位于堆中)。 sizeof(maLigne)
是堆栈中对象的大小(总是相同,通常是两个指针大小,无论包含的数据如何),但不是字符串长度。
这就是错误。
因此,您需要知道字符串所在的指针(c_str()
函数成员),元素大小(sizeof(char)
,因为string
类与{{1}一起使用})和元素的数量(字符串长度:char
成员函数)。
但最好使用C风格函数,最好使用I / O C ++函数:
size()
您还没有意识到缓冲区和大小,因为流对象(std::ofstream fichierEcrit("my_file_name");
std::string maLigne;
fichierEcrit << maLigne;
)上的运算符<<
和字符串对象(fichierEcrit
)为您管理。< / p>