我写了一个程序,将流派、视图状态和标题写入不同的文件,最后两个一切都很好,但由于某种原因,流派不想以 UTF-8 编码保存。我可以手动更改编码,但下次编写时,它会自行更改回 ANSI,而不是所需的文本,它会变成一只胆鸟。我试图创建一个新文件,但由于某种原因问题再次出现。
负责编写的代码部分。
void set_name(char *p_name) {
ofstream outside_name("C:\\Users\\dimak\\Desktop\\C++\\Фильмы 2.0\\Name.txt", ios::out | ios::app | ios::binary);
outside_name.write((char*) p_name, sizeof p_name);
outside_name.write("\n", 1);
}
void set_ganre(char* p_ganre) {
ofstream outside_ganre("C:\\Users\\dimak\\Desktop\\C++\\Фильмы 2.0\\Ganre.txt", ios::out | ios::app | ios::binary);
outside_ganre.write((char*)&p_ganre, sizeof p_ganre);
outside_ganre.write("\n", 1);
}
void set_w_unw(char p_w_unw) {
ofstream outside_w_unw("C:\\Users\\dimak\\Desktop\\C++\\Фильмы 2.0\\W_Unw.txt", ios::out | ios::app | ios::binary);
outside_w_unw.write((char*) &p_w_unw, sizeof p_w_unw);
outside_w_unw.write("\n", 1);
}
试图进入
setlocale(LC_ALL, "ru");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
但这并没有改变这种情况。
命令
sizeof p_name是一个常量值,它返回变量类型的大小。在您的情况下,指针的大小是char *.数据必须根据行的大小写入文件。也就是说,使用
strlen.当你写一个流派时,你将一个指针传递给一个指针,然后粗略地将类型更改为一个指向字符串的指针。死板改型,只有想好。
写入文件命令仅传输字节。她不在乎它们是什么编码。
set_name()您将指向字符串的指针传递给函数,然后它是相同的-.write()一切都是正确的。你set_ganre()将一个指向字符串的指针传递给函数,并且在内部你.write()已经传递了这个指针的地址,而不是字符串的地址(char*)&p_ganre。在这里,从指针地址开始的垃圾被写入。垃圾被写入文件,而不是编码错误的数据。好吧,@AlexGlebe 写得对——记录的字节数必须通过
strlen().