关于C++中读写文件出现乱码的问题

来源:百度知道 编辑:UC知道 时间:2024/05/03 20:38:45
这是VC++中的一个按钮上的代码,功能是单击后会出现一个CFileDialog类的对话框,获得路径后赋给m_strPath里,然后在m_strNr里读入那个路径里的文件内容,在m_Nr控件里输出,可是我输出的时候有的地方会出现乱码,而且不换行,好像是回车字符不能读出来,这是怎么回事??

void CMy1Dlg::OnButton1()
{

CFileDialog d1(true);
m_strNr.Empty();
m_strPath.Empty();
d1.DoModal();
m_strPath=d1.GetPathName();
m_Path.SetWindowText(m_strPath);

char buff[100];
FILE* f1;
f1=fopen(m_strPath,"r");
while(!feof(f1))
{
fread(buff,100*sizeof(char),1,f1);
m_strNr=m_strNr+buff;
}
m_Nr.SetWindowText(m_strNr);
fclose(f1);
}
谢谢大家的帮忙,可是我都试了一下,乱码问题还是存在,但是我发现只要fopen用参数rb以二进制方式打开回车、tab这些特殊附后显示就没问题,这是什么原因呢??

乱码问题我觉得可能是编码方面有问题,我把文本文件里的内容复制到一个新文件里就没问题了,现在主要就是为什么用 "r"打开会读不到回车符呢??

buff的大小改为101。
char buff[101];
每次fread完100个char之后,给最后一个buff[101]赋值为'\0'。
否则你在执行m_strNr=m_strNr+buff;这个语句的时候,系统把buff指向的字符串append到m_strNr上就会出现问题,因为系统要找到buff的结束符'\0',而这个值为0的内存地址不知道在buff后面的哪个地方出现。多半不会正好是buff后的第101个位置,说不定是第200个位置才出现了0,那么这199个char表示的字符串肯定就是乱码了,加到m_strNr上结果就可想而知了。 如果你断点设到这里的话,你可以查看buff,它已经是乱码了。
而且fread(buff,100*sizeof(char),1,f1); 这个最好改成
int n = fread(buff,sizeof(char),100,f1);
你不能保证你文件的长度正好是100字节的倍数吧。否则最后一次肯定是读不到100个字节的。这时你就得判断如果n != 100,那么你就得给buff[n]赋值为'\0'。然后才能+到m_strNr上去。
in text mode, carriage return–linefeed combinations are translated into single linefeeds on input, and linefeed characters are translated to carriage return–linefeed combinations on output. (MSDN)
大概是说在fread的时候,会把回车换行处理成单一的换行,fwrite到文件时候又会把换行还原成回车换行吧。你read了之后交给了其他控件,可能就没有回车符了。

BUFF在初始化时给赋个初值都给成‘0’,把BUFF每次在用之前都清空一下,看看还有没有乱码。

你试试:
f1=fopen(m_strPath,"r");
改成:
f1=fopen(m_strPath,"rt