开发环境: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上断言会失败(也就是标红的代码行)。为什么?解决方法?谢谢各位了先!

解决方案 »

  1.   

    不过这个while(true)是不是狠了点,只写一次的话也会出断言么?
      

  2.   

    如果是这样的话我见意最好把fprintf化分一下。
    log字串整理好,再去写file,这样出问题了也好差别是字串部分的问题,还是写file的问题.
      

  3.   

    你干脆写在type-catch语句中,看什么异常
      

  4.   

    to oldn_CC_bird
    没明白意思,您的意思是问题有二,如下
    1、可能是字符串本身有问题;
    2、写文件是有问题。
    那么:
    1、字符串的什么问题会导致失败?
    2、写文件会有什么问题?
    谢谢!to jinling4388
    这不是病毒,在线程函数中这样写日志很正常。
      

  5.   

    d:\\test.txt这个文件被别的程序独占读写了????
      

  6.   

    to jameshooo
    胡大哥出马了。
    可否指点下:“写文件失败;字符串本身不正常”具体会是什么?列举几个原因或者可能的情况也可以。to ToperRay
    这个文件是被一个线程单独以"a"模式写入的,应该不会被别的程序独占读写,否则的话fopen应该失败而不会走到fprintf代码行。谢谢!
      

  7.   

    to lllyyy2403
    磁盘写满的情况存在的可能性比较小,不过有待我进一步确认。
      

  8.   

    有可能哦,虽然fprintf是线程安全的,但是楼主的sleep(1),也太抢占cpu时间了
      

  9.   

    1.字符串是否会有一些特殊字符等,影响字符串长度。
    2.出问题时,是否文件size比较大
    3.可以写log的时候,以当天日期等作为文件名,只有每天的log才会写入一个文件,从而不会一直写同一个文件,造成log文件过大...
      

  10.   

    to Dolphin_001
    实际的服务器中是sleep(100)
    我上面的代码是为了想让单个文件迅速达到4GB和让磁盘满而故意写的sleep(1)谢谢!
      

  11.   

    用一个LONG的数据来记录你每次写入文件的值,每次加入多少就加多少,
    判断大于200*1024*1024时,重新建一个文件再置为0
      

  12.   

    to oyljerry 和 jl1872002
    实际的服务器写日志是每小时新建一个日志文件,而不是一直写一个文件。我给出的代码只是为了极限测试。
      

  13.   

    to oyljerry
    1.字符串是否会有一些特殊字符等,影响字符串长度。 
    2.出问题时,是否文件size比较大 1、字符串如果有特殊字符最多是该字符无法写入,而不至于出错?
    2、文件大概多大时会出问题?
    谢谢!
      

  14.   

    to  jl1872002
    用一个LONG的数据来记录你每次写入文件的值,每次加入多少就加多少, 
    判断大于200*1024*1024时,重新建一个文件再置为0大于200*1024*1024时就会出问题吗?为什么?
    谢谢!
      

  15.   

    #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);

      

  16.   

    to pasdingfp = fopen("d:\\test.txt", "rw"); 
    如果d:\\test.txt不存在,则fp会是NULL
      

  17.   

    fp = fopen("d:\\test.txt", "a"); 
    改成 
    fp = fopen("d:\\test.txt", "rw");
    试一下 
      

  18.   

    那么,fprintf又有什么问题呢? 但现在问题既然出现了,
    我们这样作只是进一步细化问题的所在地。
      

  19.   

    磁盘满的话也不会出assert,最后是fprintf返回失败.
      

  20.   

    ntfs下文件没有大小限制,至少我的文件写到8个G,没出现啥问题,只要硬盘够就ok
      

  21.   

    1. 调试
    2. 放在try-catch语句中,看什么异常
      

  22.   

    对了,在你这种反复长时间运行的代码尽量采用C代码会有意想不到的好处,比如你上面的string sTest = "hellohellohellohellohellohellohellohelloh 
    ellohellohellohellohellohellohellohello";可以采用char sTest[1000] = "hellohellohellohellohellohellohellohelloh 
    ellohellohellohellohellohellohellohello";
    来代替,至少在测试查找不到问题时可以这样。
      

  23.   

    to oldn_CC_bird
    ntfs下文件没有大小限制,至少我的文件写到8个G,没出现啥问题,只要硬盘够就ok我做测试时只能写到4GB,就写不进去了。
    但是fprintf返回的值是实际写入数据的长度+1,也就是sTest.size()+1,说明fprintf执行成功了。
    磁盘格式是ntfs。能指教下吗,为啥我写不到8GB?
      

  24.   

    我就是用cfile写的,fat32下好像是2G+就不成了,ntfs下没问题.
      

  25.   

    to oldn_CC_bird
    谢了先!
      

  26.   

    to lllyyy2403
    单就楼主列出的程序来看,这个问题应该不是程序本身的问题。因此问题应该出在运行环境上。建议楼主换一台电脑运行试试。 
    当然,如果楼主还有其他代码同时运行,那就难说了,比如其它代码导致内存出错等。1、环境问题会是什么?磁盘某个磁道有问题有可能吗?
    2、服务器程序中肯定有其他线程在运行,至于有没有导致内存出错,估计应该不会有。
      

  27.   

    刚想起来,俺从来不用fprintf,sprintf都有点不太保险。
      

  28.   

    to jennyvenus
    刚想起来,俺从来不用fprintf,sprintf都有点不太保险。 能否具体说说fprintf,sprintf不保险的地方?洗耳恭听,呵呵。
      

  29.   

    to cnzdgs先确认一下,你贴出来的这段代码是否会发生问题?如果运行这段代码目前尚未出现过问题,那看它就没意义了。 
    既然是断言失败,并且定位到了出错的代码,那么应该可以查看到出错时程序的详细情况。具体是哪个参数有问题,参数的值是多少,程序中哪些地方可能影响该参数的值?如果不知道这些信息是很难推测问题。 
    可以用工具查一下程序是否存在内存越界,对于复杂的程序,内存越界引起的问题是很难发现的,最好先排除。 
    另外注意一下可能发生的各种异常情况,例如各种资源的占用情况,栈空间的使用情况,及其它可能造成程序不稳定的因素。很荣幸王大哥能够光顾我的帖子,呵呵。感谢您能提出这些建议,我先排查这些因素。
      

  30.   

    to bragi523
    的确,加日志是一个好主意,但是我给的代码本身就是写日志的代码。
      

  31.   

    fprintf上断言会失败是什么断言,直接Attach进去看看。不过我觉得是string对象的内容被改变了导致c_str()指针无效的概率比较大。
      

  32.   

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

  33.   

    怀疑楼主是忽悠人中
    虽然很想讲代码进行到底,不过反复的fopen实在是浪费时间,测试到2G 是遥遥无期啊
    另外楼主确信是代码问题而不是服务器问题吗?
    再另外线程定期重启或许能暂时解决这个问题
      

  34.   

    if ( fp!=NULL ) 

    fprintf(fp, "%s\n", sTest.c_str()); 
    fclose(fp); 
    printf("%20d\r",i++);

    else
    printf("%40d\r",i++);
      

  35.   

    to wangk:
    fprintf上断言会失败是什么断言,直接Attach进去看看。 
    不过我觉得是string对象的内容被改变了导致c_str()指针无效的概率比较大。 怎样可以让你说的情况复现呢?to TRUE:
    这样的话,如果硬盘没有满,文件内容大小限制没有关系的话,是否内存是否已经满了,在进行sTest.c_str()的时候,失败的,你可以把这句提到前面,看看是否这句出现问题。内存是否满,不确认。to Joephia:
    你觉得我没事来忽悠大家有什么好处?呵呵
    我给出的代码只是样例,你把字符串放得长一点不就很容易到2G了吗?
    服务器已经运行好几年了,按说不会有大问题。
    现在出现的这个问题,服务器重启就能解决,但是这是权宜之计。