string类型的变量能写入二进制文件?
显然是不能的,C++中的string型变量本质还是个指针,在C中常常用char*或者是char数组来处理字符串,而C++可以通过string变量很方便地处理字符串,但如果要将其写入二进制文件,它将以指针(地址)的形式写入文件,当你再次读取它时,你读取的只是一个内存地址而已,然而这个内存空间在你关闭程序或者是被delete的时候已经被释放了,已然成了一块无效的内存地址,你之前的数据自然也就丢失了。
解决方案
在定义数据成员的时候,就乖乖用char数组吧,当然其他地方还是可以用string,只要保证你需要写入二进制文件的数据是真实的数据,而不是一个指针,用char数组就很方便了,我们都知道字符串以\0
结尾,判断什么时候到\0
什么时候就停止读取,你的字符串就被作为一个数组将一个个字母挨个写入二进制文件了,读取二进制文件也是一个道理。
void createUser(userAccount* last)
{
int newUID, newGroup;
char pass[16] = "\0" , newName[10] = "\0";
userAccount *newP = new userAccount();
cout << "请输入UID(数字):" << endl;
cin >> newUID;
cout << "请输入姓名:" << endl;
cin >> newName;
cout << "请创建密码(<=16位):" << endl;
cin >> pass;
cout << "请输入用户组编号(2-3):"<< endl;
cin >> newGroup;
if(newGroup!=2&&newGroup!=3)
{
cout << "该用户组不存在,请重新输入:" << endl;
cin >> newGroup;
}
if(pass && newName)
{
newP->signUp(newUID, newName, pass, newGroup);
newP->next = NULL;
last->next = newP;
//写入文件函数
//delete [] newP;在数据写入文件后,即可释放内存
//newP = NULL;
}
}
这是我OA项目中写的注册函数,新注册的用户就接在链表末尾即可,没有必要滥用string,即使你可以通过指针将其写入二进制文件,但会使你的代码显得很不规范!
项目记录:2021-01-08 Henry