高分求救,关于写文件的问题。

scq2099yt 2010-01-21 10:21:50
开发环境:VC6.0+Windows XP
代码如下:
#include <stdio.h>
#include <string>
#include <windows.h>
using namespace std;
void main()
{
while( true )
{
string sTest = "hellohellohellohellohellohellohellohelloh
ellohellohellohellohellohellohellohello";
FILE *fp = NULL;
fp = fopen("d:\\test.txt", "a");
if ( fp!=NULL )
{
fprintf(fp, "%s\n", sTest.c_str());
fclose(fp);
}
Sleep(1);
}
}

出现问题:这段代码有时候会出错,在fprintf上断言会失败(也就是标红的代码行)。为什么?解决方法?

谢谢各位了先!
...全文
358 65 打赏 收藏 转发到动态 举报
写回复
用AI写文章
65 条回复
切换为时间正序
请发表友善的回复…
发表回复
scq2099yt 2010-01-25
  • 打赏
  • 举报
回复
to wangk:
fprintf上断言会失败是什么断言,直接Attach进去看看。
不过我觉得是string对象的内容被改变了导致c_str()指针无效的概率比较大。

怎样可以让你说的情况复现呢?

to TRUE:
这样的话,如果硬盘没有满,文件内容大小限制没有关系的话,是否内存是否已经满了,在进行sTest.c_str()的时候,失败的,你可以把这句提到前面,看看是否这句出现问题。

内存是否满,不确认。

to Joephia:
你觉得我没事来忽悠大家有什么好处?呵呵
我给出的代码只是样例,你把字符串放得长一点不就很容易到2G了吗?
服务器已经运行好几年了,按说不会有大问题。
现在出现的这个问题,服务器重启就能解决,但是这是权宜之计。
lllyyy2403 2010-01-21
  • 打赏
  • 举报
回复
对了,在你这种反复长时间运行的代码尽量采用C代码会有意想不到的好处,比如你上面的string sTest = "hellohellohellohellohellohellohellohelloh
ellohellohellohellohellohellohellohello";可以采用char sTest[1000] = "hellohellohellohellohellohellohellohelloh
ellohellohellohellohellohellohellohello";
来代替,至少在测试查找不到问题时可以这样。
lllyyy2403 2010-01-21
  • 打赏
  • 举报
回复
单就楼主列出的程序来看,这个问题应该不是程序本身的问题。因此问题应该出在运行环境上。建议楼主换一台电脑运行试试。
当然,如果楼主还有其他代码同时运行,那就难说了,比如其它代码导致内存出错等。
xwsn007 2010-01-21
  • 打赏
  • 举报
回复
1. 调试
2. 放在try-catch语句中,看什么异常

oldn123 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 jl1872002 的回复:]
一个文件的大小 是有限定的,你最好判断大于几M时重新建一个文件,或者一天建一个文件,还有不要每次都去打开
[/Quote]
ntfs下文件没有大小限制,至少我的文件写到8个G,没出现啥问题,只要硬盘够就ok
oldn123 2010-01-21
  • 打赏
  • 举报
回复
磁盘满的话也不会出assert,最后是fprintf返回失败.
oldn123 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 scq2099yt 的回复:]
to oldn_CC_bird
没明白意思,您的意思是问题有二,如下
1、可能是字符串本身有问题;
2、写文件是有问题。
那么:
1、字符串的什么问题会导致失败?
2、写文件会有什么问题?
谢谢!

to jinling4388
这不是病毒,在线程函数中这样写日志很正常。

[/Quote]
那么,fprintf又有什么问题呢? 但现在问题既然出现了,
我们这样作只是进一步细化问题的所在地。
hongya6088 2010-01-21
  • 打赏
  • 举报
回复
fp = fopen("d:\\test.txt", "a");
改成
fp = fopen("d:\\test.txt", "rw");
试一下
scq2099yt 2010-01-21
  • 打赏
  • 举报
回复
鹦鹉兄也太谦虚了
djjs280 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 happyparrot 的回复:]
看热闹。分高的问题,一般都答不了.
[/Quote]
//agree
快乐鹦鹉 2010-01-21
  • 打赏
  • 举报
回复
看热闹。分高的问题,一般都答不了.
scq2099yt 2010-01-21
  • 打赏
  • 举报
回复
to pasding

fp = fopen("d:\\test.txt", "rw");
如果d:\\test.txt不存在,则fp会是NULL
Pasding 2010-01-21
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string>
#include <windows.h>
using namespace std;
void main()
{

FILE *fp = NULL;
fp = fopen("d:\\test.txt", "rw");

while( true )
{
string sTest = "hellohellohellohellohellohellohellohelloh
ellohellohellohellohellohellohellohello";

if ( fp!=NULL )
{
fprintf(fp, "%s\n", sTest.c_str());

}
Sleep(1);
}

fclose(fp);
}
CBEMA 2010-01-21
  • 打赏
  • 举报
回复
学习
scq2099yt 2010-01-21
  • 打赏
  • 举报
回复
to jl1872002
用一个LONG的数据来记录你每次写入文件的值,每次加入多少就加多少,
判断大于200*1024*1024时,重新建一个文件再置为0

大于200*1024*1024时就会出问题吗?为什么?
谢谢!
sk_sakula 2010-01-21
  • 打赏
  • 举报
回复
可能是文件过大吧
scq2099yt 2010-01-21
  • 打赏
  • 举报
回复
to oyljerry
1.字符串是否会有一些特殊字符等,影响字符串长度。
2.出问题时,是否文件size比较大

1、字符串如果有特殊字符最多是该字符无法写入,而不至于出错?
2、文件大概多大时会出问题?
谢谢!
scq2099yt 2010-01-21
  • 打赏
  • 举报
回复
我刚才跟同事确认了,磁盘没有满,单个文件也没有大于4GB。出现问题时,重启服务器就不会报错了。
scq2099yt 2010-01-21
  • 打赏
  • 举报
回复
to oyljerry 和 jl1872002
实际的服务器写日志是每小时新建一个日志文件,而不是一直写一个文件。我给出的代码只是为了极限测试。
jl1872002 2010-01-21
  • 打赏
  • 举报
回复
用一个LONG的数据来记录你每次写入文件的值,每次加入多少就加多少,
判断大于200*1024*1024时,重新建一个文件再置为0
加载更多回复(45)

16,472

社区成员

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

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

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