开发环境: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上断言会失败(也就是标红的代码行)。为什么?解决方法?谢谢各位了先!
代码如下:
#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上断言会失败(也就是标红的代码行)。为什么?解决方法?谢谢各位了先!
解决方案 »
- ▓▓▓▓▓ CListCtrl设置了 LVS_EX_CHECKBOXES 风格,checkbox怎么居中?▓▓▓▓▓
- vc 6.0 的Release版和Debug版有什么不同?
- 单文档分割窗体后如何分别得到左右两侧部分的相对位置坐标!
- Conncetion.Open()函数的参数解释
- 请教在Access中设置IP的数据类型设成什么的好?另求VisualC++6.0技术内幕的中文电子版
- 如果在窗体中实现文件拖拽
- 不懂,问一下
- 有没有像QQ一样的聊天程序?可以实现两个局域网聊天和语音传输,希望可以找到
- 现在到底有多少公司在用vc进行项目开发啊?
- 熟悉createinstall软件的朋友请进!
- 如何判断某个字符串是否是word中的书签?
- 求个算法
log字串整理好,再去写file,这样出问题了也好差别是字串部分的问题,还是写file的问题.
没明白意思,您的意思是问题有二,如下
1、可能是字符串本身有问题;
2、写文件是有问题。
那么:
1、字符串的什么问题会导致失败?
2、写文件会有什么问题?
谢谢!to jinling4388
这不是病毒,在线程函数中这样写日志很正常。
胡大哥出马了。
可否指点下:“写文件失败;字符串本身不正常”具体会是什么?列举几个原因或者可能的情况也可以。to ToperRay
这个文件是被一个线程单独以"a"模式写入的,应该不会被别的程序独占读写,否则的话fopen应该失败而不会走到fprintf代码行。谢谢!
磁盘写满的情况存在的可能性比较小,不过有待我进一步确认。
2.出问题时,是否文件size比较大
3.可以写log的时候,以当天日期等作为文件名,只有每天的log才会写入一个文件,从而不会一直写同一个文件,造成log文件过大...
实际的服务器中是sleep(100)
我上面的代码是为了想让单个文件迅速达到4GB和让磁盘满而故意写的sleep(1)谢谢!
判断大于200*1024*1024时,重新建一个文件再置为0
实际的服务器写日志是每小时新建一个日志文件,而不是一直写一个文件。我给出的代码只是为了极限测试。
1.字符串是否会有一些特殊字符等,影响字符串长度。
2.出问题时,是否文件size比较大 1、字符串如果有特殊字符最多是该字符无法写入,而不至于出错?
2、文件大概多大时会出问题?
谢谢!
用一个LONG的数据来记录你每次写入文件的值,每次加入多少就加多少,
判断大于200*1024*1024时,重新建一个文件再置为0大于200*1024*1024时就会出问题吗?为什么?
谢谢!
#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);
}
如果d:\\test.txt不存在,则fp会是NULL
改成
fp = fopen("d:\\test.txt", "rw");
试一下
我们这样作只是进一步细化问题的所在地。
2. 放在try-catch语句中,看什么异常
ellohellohellohellohellohellohellohello";可以采用char sTest[1000] = "hellohellohellohellohellohellohellohelloh
ellohellohellohellohellohellohellohello";
来代替,至少在测试查找不到问题时可以这样。
ntfs下文件没有大小限制,至少我的文件写到8个G,没出现啥问题,只要硬盘够就ok我做测试时只能写到4GB,就写不进去了。
但是fprintf返回的值是实际写入数据的长度+1,也就是sTest.size()+1,说明fprintf执行成功了。
磁盘格式是ntfs。能指教下吗,为啥我写不到8GB?
谢了先!
单就楼主列出的程序来看,这个问题应该不是程序本身的问题。因此问题应该出在运行环境上。建议楼主换一台电脑运行试试。
当然,如果楼主还有其他代码同时运行,那就难说了,比如其它代码导致内存出错等。1、环境问题会是什么?磁盘某个磁道有问题有可能吗?
2、服务器程序中肯定有其他线程在运行,至于有没有导致内存出错,估计应该不会有。
刚想起来,俺从来不用fprintf,sprintf都有点不太保险。 能否具体说说fprintf,sprintf不保险的地方?洗耳恭听,呵呵。
既然是断言失败,并且定位到了出错的代码,那么应该可以查看到出错时程序的详细情况。具体是哪个参数有问题,参数的值是多少,程序中哪些地方可能影响该参数的值?如果不知道这些信息是很难推测问题。
可以用工具查一下程序是否存在内存越界,对于复杂的程序,内存越界引起的问题是很难发现的,最好先排除。
另外注意一下可能发生的各种异常情况,例如各种资源的占用情况,栈空间的使用情况,及其它可能造成程序不稳定的因素。很荣幸王大哥能够光顾我的帖子,呵呵。感谢您能提出这些建议,我先排查这些因素。
的确,加日志是一个好主意,但是我给的代码本身就是写日志的代码。
虽然很想讲代码进行到底,不过反复的fopen实在是浪费时间,测试到2G 是遥遥无期啊
另外楼主确信是代码问题而不是服务器问题吗?
再另外线程定期重启或许能暂时解决这个问题
{
fprintf(fp, "%s\n", sTest.c_str());
fclose(fp);
printf("%20d\r",i++);
}
else
printf("%40d\r",i++);
fprintf上断言会失败是什么断言,直接Attach进去看看。
不过我觉得是string对象的内容被改变了导致c_str()指针无效的概率比较大。 怎样可以让你说的情况复现呢?to TRUE:
这样的话,如果硬盘没有满,文件内容大小限制没有关系的话,是否内存是否已经满了,在进行sTest.c_str()的时候,失败的,你可以把这句提到前面,看看是否这句出现问题。内存是否满,不确认。to Joephia:
你觉得我没事来忽悠大家有什么好处?呵呵
我给出的代码只是样例,你把字符串放得长一点不就很容易到2G了吗?
服务器已经运行好几年了,按说不会有大问题。
现在出现的这个问题,服务器重启就能解决,但是这是权宜之计。