C++ 用ifstream 类读写文件乱码的问题!
最近在做有关文件读写的作业,没做之前,以为只是文件读写而已,认为很简单,可是一做发现问题多多!!!!具体如下:
文件编码:UTF-8.
打开文件方式:ifstream inFile("intext.txt", std::ios::binary|std::ios::in )
ofstream outFile("outtext.txt", std::ios::binary|std::ios::out )
读取文件:
char p[1024 +1 ];
inFile.read( p, 1024 );
p[1024] = '\0';
std::string str( p );
//对str 进行一些操作,只要是删除部分文件。
std::cout<<str;//中文部分乱码了
写入文件:
outfile.write( str, 1024 );//乱码了,部分中文可以看到,部分不见了。
请问如何解决问题啊?菜鸟求教中。。。
另外:对于字符串的操作总是涉及到编码的问题,常常感到束手无策,比如;长字符,ansi字符,还有等等,请问该如何避免字符之间编码的问题啊。最好是不要太依赖平台啊!
谢谢!
你要想到, string类型其实是一个很复杂的类型的!
[解决办法]
而你读取的文件时UTF-8,读进来当ANSI来用,中文肯定是乱码
[解决办法]
建议:
1. 有中文字符时,用宽字符(wchar_t, wstring, wcout, wfstream...),且使用locale("chs")
2. 不要使用std::io_base::binary, 尤其是你不知道它是干嘛的。
[解决办法]
#include<iostream>
#include <fstream>
#include <locale>
struct record
{
wchar_t id[9];
wchar_t name[3];
float score;
};
int main()
{
record r[] = {
{L"12345678", L"张三", 98.3f},
{L"87654321", L"李四", 89.66f},
{L"76778981", L"王五", 89.6778f}
};
std::locale chs("chs"); //处理中文字符
//output
{
std::wofstream ofs("data.txt");
ofs.imbue(chs);
for (int i = 0; i < sizeof(r)/sizeof(r[0]); i++)
{
ofs << r[i].id << L"##" << r[i].name << L"##" <<
r[i].score << std::endl;
}
}
//input
{
std::wifstream ifs("data.txt");
ifs.imbue(chs);
std::wcout.imbue(chs);
std::wstring line;
while(std::getline(ifs, line))
{
std::wcout << line << std::endl;
}
}
return 0;
}