----------------------- int k;
k = recv(Client,buf,100,0);
// readn(Client,buf,100);
CFile destFile;
CString m_fname;
FILE* fp=NULL;
m_fname = "chen.txt";
if((fp=fopen(m_fname,"r"))==NULL)
{
destFile.Open(m_fname, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone);
}
else
{
fclose(fp);
destFile.Open(m_fname,CFile::modeWrite | CFile::typeBinary|CFile::shareDenyNone);
} destFile.Open(m_fname, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone);
destFile.Seek(0,CFile::begin);
destFile.Write(buf, 100);
--------------------------------------------------------------
上面就是我程序中的一段了。
(原文不是这样,被我简化了)
我的问题是,为什么接收到的字节不是原原本本的按照次序的写在文件里,而且后来接到的把前面接到的覆盖了。
传送过来的文件,大概有800k,4k一个包传送,可是我的文件始终只有100字节大小。怎么改?
那个地方有错误?

解决方案 »

  1.   

    if((fp=fopen(m_fname,"r"))==NULL)
    要放在while外,打开一次即可,何必打开那么多次?destFile.Seek(0,CFile::begin);你每次写入后都把文件指针置到文件头,自然每次都从文件头开始写了,把这段去掉
      

  2.   

    要用循环语句
      int k=0;
      while(true)
       {
          k = recv(Client,buf,filelenth,0);
          ..........
         /对接收的数据进行处理
          .............
           if(k>filelenth) break;
       }
      

  3.   

    destFile.Seek(0,CFile::begin);
    ---------------------------------
    这条语句已经被注销了,我忘了标记了,不行,还是就100个字节。
      

  4.   

    文件指针没有移到末尾,应该是。
    不知道你是不是先Open然后循环Write?如果循环Open应该每次都是从头开始Write。
    GetPosition看看,是不是每次都在文件头?如果不是,就SeekToEnd看看。
      

  5.   

    GetPosition的返回值是零,SeekToEnd得返回值竟然也是零?晕,大侠,帮帮我怎么弄?
      

  6.   

    把你写文件的代码贴出来看看。
    你是不是没有循环recv?
      

  7.   

    int cnt;//
    int rc;
    cnt = 4102;
    while(cnt>0)
    {
    rc=recv(fd,bp,100,0);
    j = bp[0];
    i = bp[11];
    bp+=rc;
    cnt = cnt - rc;
    if(j == 1||i == 3)
    cnt = 0;
    }
    ------------------------------------------------------------------------
    这个就是我的循环了。
      

  8.   

    把Open、Close放在循环外。
    if((fp=fopen(m_fname,"r"))==NULL)干什么用?
    用CFile不就OK?
      

  9.   

    open和close本来就在循环外面阿?if((fp=fopen(m_fname,"r"))==NULL)是这个意思:
    如果打开m_fname文件失败,说明此文件并不存在,也就是说:这是第一次下载。
      

  10.   

    if(!destFile.Open(m_fname,CFile::modeCreate|CFile::modeNoTruncate| CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone))
        return 错误
    就可以搞定你的
    if((fp=fopen(m_fname,"r"))==NULL)
    {
    destFile.Open(m_fname, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone);
    }
    else
    {
    fclose(fp);
    destFile.Open(m_fname,CFile::modeWrite | CFile::typeBinary|CFile::shareDenyNone);
    } destFile.Open(m_fname, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone);
      

  11.   

    建议你用两个函数实现:PrepareReceiveFile和ReceiveFile
    PrepareReceiveFile(CString strFileName)
    {
    if(m_File.m_hFile != NULL)
    m_File.Close(); if(!m_File.Open(strFileName, CFile::modeWrite | CFile::modeCreate | CFile::modeNoTruncate | CFile::shareDenyWrite))
    return; m_File.SeekToEnd();
    }
    ReceiveFile函数中根据recv返回值进行switch,将接收到文件内容部分直接写入文件就可以了
      

  12.   

    --------------------------------------------------------
    //这是接受部分的代码。
    int cnt;//用来保存剩余的字节数。
    int rc;
    cnt = 4102;
    while(cnt>0)
    {
    rc=recv(fd,bp,100,0);
    j = bp[0];
    i = bp[11];
    iii = bp;
    bp+=rc;
    cnt = cnt - rc;
    if(j == 1||i == 3)
    cnt = 0;
    }
    -------------------------------------------------
    //这是写入文件部分的代码。
    int j = iii.GetLength();
    CFile destFile;
    CString m_fname;
    FILE* fp=NULL;
    m_fname = "chen.txt";
    if(!destFile.Open(m_fname,CFile::modeCreate|CFile::modeNoTruncate| CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone))
        return;
    DWORD dd = destFile.SeekToEnd();
    destFile.Write(iii, len0);
    ---------------------------------------------------------
      

  13.   

    这些代码是关键代码,别的都是些无关紧要的。还有,一个文件有800k,可是我收到的只有20k,这是怎么了谢谢,lhj兄。
      

  14.   

    你的问题挺奇怪的,我写了点代码
    CFile mFile;
    if(!mFile.Open("Test.txt",CFile::modeCreate|CFile::modeNoTruncate| CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone))
    AfxMessageBox("Error!");
    for(int iLoop = 0 ; iLoop < 10 ; iLoop ++)
    {
    mFile.SeekToEnd();
    mFile.Write("AAA\n",4);
    }
    mFile.Close();
    没有问题.
    再就是你recv之前最好memset(bp,……)
    你接受的文件小有可能是你循环提前退出了吧?
    你可以先测试你的写文件是否是有什么问题,把recv屏蔽掉,附上一个值,看看能不能正常写入文件。
      

  15.   

    我现在接受一段写一个数据,可是收到的竟然是乱码,是这个东西:&#52685;和&yuml;。
    用二进制打开文件一看全都是CDCDCDCD……郁闷阿,怎么会事?
    接受语句我没作循环。
    rc=recv(fd,bp,100,0);
      

  16.   

    那我就不明白你就接受一次然后就退出了?
    那你
    while(cnt>0)
    {
    rc=recv(fd,bp,100,0);
    j = bp[0];
    i = bp[11];
    iii = bp;
    bp+=rc;
    cnt = cnt - rc;
    if(j == 1||i == 3)
    cnt = 0;
    }
    什么意思?
      

  17.   

    你没有循环recv所以一个文件有800k,可是收到的只有20k
    recv乱码是不是跟你send的数据有关系?
      

  18.   

    楼上L兄,我加你了。你不在线上,所以就在这里问个问题吧。一个char* p里的3456位,存储着一个四位的16进制数,例如:0x1006.
    我怎么才能把这个数读出来?
      

  19.   

    你的意思是4位16进制数放到char [4]里面?
    sscanf(……,"%x",……)