让我发愁的CFile和CString? 大家帮看看

songq 2002-08-01 01:15:52
const char* pFilename="文件名";
char buffer[100];
CString buffString;
CFile file;
if (!file.Open (pFilename,CFile::modeReadWrite))
{
AfxMessageBox("Can not open file!");
return;
}
while(file.Read (buffer,100));
{

buffString+=buffer;
}

AfxMessageBox(buffString);

............

file.Close ();

执行以上代码,为什么buffString中的内容只有文件的一部分呢? 请问各位原因.
...全文
189 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
howtotell 2002-08-02
  • 打赏
  • 举报
回复
1 缓冲区要开大一些.
2 bufferString.Format("%%s",bufferString,buffer);
3 CString pFilename="文件名";
4 if (!file.Open (pFilename,CFile::modeReadWrite))
{
fp.Close();
AfxMessageBox("Can not open file!");
return;
}
Zark 2002-08-02
  • 打赏
  • 举报
回复
问题出在CFile::Read()函数中的buffer是不带NULL结尾的.所以程序应该是这样:

while(int nLen=file.Read(buffer,99))
{
buffer[nLen]='\0';
bufferString+=buffer;
}
如果是UNICODE,不要读99个,改读98个即可.
liuns 2002-08-02
  • 打赏
  • 举报
回复
while(file.Read (buffer,100));
{

buffString+=buffer;
}
你的程序永远读开头的那100个数据。因为你没有移动文件指针到相应的位置而且CSTRING也是有大小限制的。这样很容易当机。正确的写法是
void CCFileDemoDoc::OnFileOpen()
{
// TODO: Add your command handler code here
int len;
char* m_string;
CFile file;
CFileDialog cfd(
TRUE,NULL,NULL,OFN_HIDEREADONLY,
"Text Files(*.txt)|*.txt|Data Files(*.dat)|*.dat|",NULL);
if(cfd.DoModal()==IDOK)
{
file.Open(cfd.m_ofn.lpstrFile ,CFile::modeRead,NULL);
len=file.GetLength();

HGLOBAL hData =GlobalAlloc(GMEM_MOVEABLE,len);
m_string=(char*)GlobalLock(hData);
file.Read(m_string,len);
m_filelen =len;
UpdateAllViews(NULL,0L,NULL);


}

}
好好的琢磨把这样写读大的文件时不会有问题的。
virtualfunction 2002-08-02
  • 打赏
  • 举报
回复
用以下代码保证无误,它可以读取任意格式的文件,事先不必分配缓冲区大小。

char *pbuff=NULL;
char *pfilename="....";
CString strContent;
.
.
.
CFile file;
if(!file.Open(pfilename,CFile::modeRead|CFile::typeBinary)) // <--
{
.
return;
}
UINT len=file.GetLength();
pbuff=new char[len+1];
file.Read(pbuff,len);
file.Close();
pbuff[len]='\0';
strContent=pbuff;
delete [] pbuff;
pbuff=NULL;
.
.

gongpingli 2002-08-01
  • 打赏
  • 举报
回复
CString是Null中止的,这样写肯定不会有问题的:
while(file.Read (buffer,100));
{
CString szTemp = buffer;
buffString+=szTemp;
}
wuchuncai 2002-08-01
  • 打赏
  • 举报
回复
buffString+=szBuffer有问题,想一想,如果szBuffer[99]多半不会是结束符,
所以buffString一定不会对
zhang1000 2002-08-01
  • 打赏
  • 举报
回复
char szBuffer[104];
memset(szBuffer, 0, 104);
while(file.Read (szBuffer,100))
{
buffString+=szBuffer;
memset(szBuffer, 0, 104);
}
songq 2002-08-01
  • 打赏
  • 举报
回复
to zhang1000(多一个零) :你对了


但是,又有问题buffString的内容最终多了一部分重复数据,怎么回事? 是不是
buffString+=szBuffer;有问题
zhang1000 2002-08-01
  • 打赏
  • 举报
回复
更正一下:

结尾有";"就不会循环了!-->就不会循环buffString+=szBuffer;了!

另外建议:
char szBuffer[104];
memset(szBuffer, 0, 104);
while(file.Read (szBuffer,100))
{
buffString+=szBuffer;
}
songq 2002-08-01
  • 打赏
  • 举报
回复
哦,哪个分号在程序里没有的,是误加上的.
yhb4 2002-08-01
  • 打赏
  • 举报
回复
这种打开方式不对
zhang1000 2002-08-01
  • 打赏
  • 举报
回复
while(file.Read (buffer,100));
改为while(file.Read (buffer,100))
结尾有";"就不会循环了!
另外建议Buffer开大一些不要刚好100,否则有可能有其它字符.
songq 2002-08-01
  • 打赏
  • 举报
回复
是文本文件,可是难道只能用ReadString()吗?

我一开始用CStdioFile,没用CString是一样的问题.
请高手给个代码段,让我看看吧 多谢了
sjzxyg 2002-08-01
  • 打赏
  • 举报
回复
应该是想显示文本文件的内容吧,直接以文本方式打开,用ReadString读出
yichunhui 2002-08-01
  • 打赏
  • 举报
回复
然也!
SecretGarden 2002-08-01
  • 打赏
  • 举报
回复
你这种搞法有问题,如果是文本文件用ReadString好了
如果是二进制文件,又怎么能用CString呢?
CString是Null中止的,当然可能不全了

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧