一个关于写文件非常奇怪的问题?

史前攻城狮 2001-04-24 09:49:00
CStdioFile file;
CString strTmp;
....
....
file.WriteString(strTmp);
file.WriteString(strTmp);
file.WriteString(strTmp);
为什么第一二次写没问题,第三次写就有问题了

...全文
149 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
benhou 2001-05-09
  • 打赏
  • 举报
回复
我试了好象没问题嘛
james_razor 2001-04-26
  • 打赏
  • 举报
回复
我劝你用CFile吧,CStdioFile打开的是流文件,流文件我用得很少,不太清楚特性,但是调试中发现只要前面有读操作,后面的写操作就要出问题。正常情况下,要么一直读,要么一直写。
例外的是,如果写操作前的读操作正好遇到了文件结尾,数据可以追加上去。这点_flsbuf.c中倒是写的很清楚:
/* Check that _IOREAD is not set or, if it is, then so is _IOEOF. Note
that _IOREAD and IOEOF both being set implies switching from read to
write at end-of-file, which is allowed by ANSI. Note that resetting
the _cnt and _ptr fields amounts to doing an fflush() on the stream
in this case. Note also that the _cnt field has to be reset to 0 for
the error path as well (i.e., _IOREAD set but _IOEOF not set) as
well as the non-error path. */
我尝试在写操作前屏蔽上次的读操作位
fMenu.m_pStream->_flag &= ~_IOREAD;
fMenu.Flush(); // 不调用这句数据无法写入
然后执行写操作,但是数据居然是追加在文件尾部的。
所以还是放弃努力吧。任何对CStdioFile的非常规操作都是危险的。何况还有CFile这个选择。
史前攻城狮 2001-04-26
  • 打赏
  • 举报
回复
请各位帮忙看一下?
史前攻城狮 2001-04-25
  • 打赏
  • 举报
回复
具体在什么情况下出错我至今也没总结出规律来
错误的现象是不但写会出错,读也会出错
错误发生的地方在这里
void CStdioFile::WriteString(LPCTSTR lpsz)
{
ASSERT(lpsz != NULL);
ASSERT(m_pStream != NULL);

if (_fputts(lpsz, m_pStream) == _TEOF) //错在这里
AfxThrowFileException(CFileException::diskFull, _doserrno, m_strFileName);
}
进一步
int __cdecl fputs (
const char *string,
FILE *stream
)
{
REG2 int buffing;
REG1 unsigned int length;
REG3 unsigned int ndone;

_ASSERTE(string != NULL);
_ASSERTE(stream != NULL);

length = strlen(string);
_lock_str(stream);
buffing = _stbuf(stream);
ndone = _fwrite_lk(string,1,length,stream);//返回的数字与字符窜长度不符
_ftbuf(buffing, stream);
_unlock_str(stream);

return(ndone == length ? 0 : EOF);
}
请哪位搞人指点一二,多谢了!
james_razor 2001-04-25
  • 打赏
  • 举报
回复
To Lansie(山河水):代码收到,正在调,有点意思,今天看来不能给你了。
To gamepolice():CString为什么不行?这里可是有一个LPCTSTR的转换的。
gamepolice 2001-04-25
  • 打赏
  • 举报
回复
你不能直接用WriteString来写入一个CString变量,因为CString变量的长度不可知。
char buf[256];
memcpy(buf,"this is a test!");
file.WriteString(buf);
因为WriteString根据'\0'来判断串的结束,而CString不用'\0'来结束一个串,这样在你读的时候会报错!
james_razor 2001-04-25
  • 打赏
  • 举报
回复
到我的信箱james_razor@21cn.com,最好有源码。
史前攻城狮 2001-04-25
  • 打赏
  • 举报
回复
to james_razor:
这样吧,我把我的htm文件发给你吧?
麻烦看一下了。
james_razor 2001-04-25
  • 打赏
  • 举报
回复
你误会了,我只是对你所写的情况判断可能是磁盘满了,自己并没有试验。但是看了你的贴子后我试了一下,没有出现问题啊,能把情况和代码描述的更清楚点吗?
史前攻城狮 2001-04-25
  • 打赏
  • 举报
回复
对,我也是报这个错
可我硬盘还有2G呢?

各位帮个忙,这个问题困扰我好几天了
james_razor 2001-04-25
  • 打赏
  • 举报
回复
try
{
fMenu.WriteString(strTmp);
}
catch(CFileException e)
{
// 在这里检查e可以得知错误信息
}
我猜可能是磁盘满了,因为它执行了这句:AfxThrowFileException(CFileException::diskFull, _doserrno, m_strFileName);
史前攻城狮 2001-04-25
  • 打赏
  • 举报
回复
CStdioFile fMenu;
CString strBuf,strFileName,strTmp;

if(!fMenu.Open("f:\\test.htm",CFile::modeReadWrite|CFile::shareDenyNone))
return;
strTmp.Format("this is a test");
fMenu.SeekToBegin();
fMenu.WriteString(strTmp);
fMenu.WriteString(strTmp);
fMenu.WriteString(strTmp);
fMenu.WriteString(strTmp);
fMenu.SeekToBegin();
while(fMenu.ReadString(strBuf))
{
if(strBuf.Find("<body")>=0)
break;
}


fMenu.WriteString(strTmp);
fMenu.WriteString(strTmp);
fMenu.WriteString(strTmp);
fMenu.WriteString(strTmp);

fMenu.Close();

test.htm是一个空的htm文件
以上语句有问题吗?
总是要出错
那位试一下好吗?
tlovexyj 2001-04-24
  • 打赏
  • 举报
回复
详细一点

16,551

社区成员

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

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

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