导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

让我发愁的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中的内容只有文件的一部分呢? 请问各位原因.
...全文
139 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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中止的,当然可能不全了
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

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