2014-11-01 42 views
0

此函數正在將文本文件讀入字符緩衝區並將指針返回到此緩衝區。如何在char * func()中正確刪除用新[]分配的char數組?

char * textfile_to_char(wchar_t *filename) 
{ 
    WIN32_FIND_DATA data; 
    if (FindFirstFile(filename,&data)==INVALID_HANDLE_VALUE) 
    { 
     wchar_t message[256]; 
     wsprintf(message,L"File could not be found %lp",filename); 
     MessageBox(0,message,0,0); 
     return NULL; 
    } 
    else 
    { 
     HANDLE hFile=CreateFile(filename,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_READONLY,0); 
     if (hFile==INVALID_HANDLE_VALUE) 
     { 
      wchar_t message[256]; 
      wsprintf(message,L"Error opening file: %lp",filename); 
      MessageBox(0,message,0,0); 
      return NULL; 
     } 
     else 
     { 
      OVERLAPPED overlapped; 
      memset(&overlapped,0,sizeof(overlapped)); 
      char * buffer=new char[data.nFileSizeLow]; 
      ReadFileEx(hFile,buffer,data.nFileSizeLow,&overlapped,0); 
      CloseHandle(hFile); 
      buffer[data.nFileSizeLow]=0; 
      return buffer; 
     } 
    } 
} 

現在,這裏是一個代碼多個片而言我用這個函數從這段文字

wchar_t filename[512]; 
wsprintf(filename,L"%s.vtx",_shader_name); 
id_vertex_shader=glCreateShader(GL_VERTEX_SHADER); 
id_fragment_shader=glCreateShader(GL_FRAGMENT_SHADER); 
char *shader_source=textfile_to_char(filename); 
char *buffers[2]={shader_source,0}; 
glShaderSource(id_vertex_shader,1,buffers,0); 
delete[] shader_source; 
glCompileShader(id_vertex_shader); 

源OpenGL着色和刪除[] shader_source其實挺讓我困惑,因爲)它不」 t工作,b)刪除shader_source也不起作用。讓我怎麼刪除它感謝

+1

'緩衝液[data.nFileSizeLow] = 0;'寫入超出緩衝區。 – AlexD 2014-11-01 00:25:05

回答

0

你做一個異步讀取,然後指望它立即讀取,然後刪除該文件處理

添加調用GetOverlappedResult的readFileEx和CloseHandle的:

ReadFileEx(hFile,buffer,data.nFileSizeLow,&overlapped,0); 
WORD bytesRead; 
if(!GetOverlappedResult(hFile, &overlapped, &bytesRead, TRUE);){ 
    //check error and such 

} 
CloseHandle(hFile); 
buffer[bytesRead]=0; 

或只是使用ReadFile的不重疊的結構:

WORD bytesRead; 
ReadFile(hFile,buffer,data.nFileSizeLow,&bytesRead,0); 
CloseHandle(hFile); 
+0

如果您打算等待異步讀取,則可以使用ReadFile而不是ReadFileEx。另外,不要使用FILE_FLAG_OVERLAPPED模式打開文件。 – 2014-11-01 00:51:29

+0

@ Smith_61 true我將它添加到答案中 – 2014-11-01 00:54:47

+0

忘記文件未被FILE_FLARE_OVERLAPPED打開的部分,以便調用ReadFileEx方法。 – 2014-11-01 01:02:34