2013-05-10 131 views
1

我已经写了这段代码,它将文本文件的内容读入缓冲区,并通过套接字发送缓冲区直到文件结束。读完文本文件的完整内容后fread()失败

代码工作正常,并且完成文件发送到套接字后,fread()失败,但是,根据我的低调,当完整的文件通过套接字发送时,由于条件(while(fpSend!= NULL )),FREAD()不能甚至被称为:(

请看看代码,不要让我知道如果你看到任何错误:(

void sendingFile() 
{ 
    FILE *fpSend ; 
    if((fpSend = fopen("Client0.txt", "r+b")) == NULL) 
     { 
     MessageBox(NULL, 
        "Unable to open the File", 
        "Error!", 
        MB_ICONEXCLAMATION | 
        MB_OK); 
     exit(EXIT_FAILURE); 
     } 

    char file_buffer[2000]; 

    fseek(fpSend, 0, SEEK_END); 
    size_t file_size = ftell(fpSend); 
    fseek(fpSend, 0, SEEK_SET); 
    while(fpSend!=NULL) 
    { 
     int bytes_read=0; 
     if((bytes_read=fread(file_buffer, 1,12, fpSend))<=0) 
      { 
       char err[128], bread[128]; 
       itoa(errno,err,10); 
       itoa(bytes_read,bread,10); 
       MessageBox(NULL, 
          "Unable to copy file into buffer", 
          bread, 
          MB_ICONEXCLAMATION | 
          MB_OK); 
       exit(1); 
      } 
     /*MessageBox(NULL, 
        file_buffer, 
        "File copied in Buffer", 
        MB_ICONEXCLAMATION | 
        MB_OK);*/ 
     if(sendto(socketIdentifier, file_buffer, bytes_read, 0, (struct sockaddr *) &AH_glb_connectedSocket, sizeof(AH_glb_connectedSocket))<0) 
      { 
       MessageBox(NULL, 
          " NOT SENNT!", 
          "ERROR!", 
          MB_ICONEXCLAMATION | 
                MB_OK); 
            //exit(1); 
      } 
     else 
      { 
       //sent 
      } 
    } 
    MessageBox(NULL, 
     "File Sent Successfully!", 
     "SENT!", 
      MB_ICONEXCLAMATION | 
      MB_OK); 
    fclose(fpSend); 
} 

回答

1

文件句柄fpSend不在文件结束后变成NULL,你应该检查feof(fpSend);

此外,使用ftell();来确定文件的大小只有在文件大小小于2GB时才有效,因为它返回32位signed int(size_t)。

+0

你是对的:) – Ayse 2013-05-10 09:11:11