首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++ 用ifstream 类读写文件乱码的有关问题

2013-08-29 
C++ 用ifstream 类读写文件乱码的问题!最近在做有关文件读写的作业,没做之前,以为只是文件读写而已,认为很

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类型其实是一个很复杂的类型的!
[解决办法]

引用:
看是它里面封装了很多函数,可以很方便地对字符串操作。而且它里面不也是通过数组来存储数据的吗?
另外,直接输出数组里面的值也是乱码啊!!

c++中,char, string 都是ANSI字符,wchar, wstring是UTF-16。


而你读取的文件时UTF-8,读进来当ANSI来用,中文肯定是乱码
[解决办法]
建议:
1. 有中文字符时,用宽字符(wchar_t, wstring, wcout, wfstream...),且使用locale("chs")
2. 不要使用std::io_base::binary, 尤其是你不知道它是干嘛的。 
[解决办法]

引用:
建议:
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;

}

热点排行