2013-03-08 63 views
0

我在google上找到了這段代碼,並進行了一些改編。只要沒有問題。但是,我在輸出文件中有很多空白行的開頭。我不知道我怎麼能擺脫這個。用winapi獲取數據

我試圖從php獲取數據。

$echo "hello file"; 

而C++

int main() 
{ 

HINTERNET connect = InternetOpen("MyBrowser",0 ,0, 0, 0); 

    if(!connect){ 
     cout<<"Connection Failed or Syntax error"; 
     return 0; 
    } 


HINTERNET OpenAddress = InternetOpenUrl(connect, http://www.myurl.com/winapi.php", 0, 0, 0, 0); 

    if (!OpenAddress) 
    { 
     DWORD ErrorNum = GetLastError(); 
     cout<<"Failed to open URL \nError No: "<<ErrorNum; 
     InternetCloseHandle(connect); 
     return 0; 
    } 

    char DataReceived[4096]; 
    DWORD NumberOfBytesRead = 0; 
    ofstream data; 
    data.open("output.txt"); 

    while(InternetReadFile(OpenAddress, DataReceived, 4096, 
     &NumberOfBytesRead) && NumberOfBytesRead) {   
     DataReceived[NumberOfBytesRead]='\x00'; 
     data<< DataReceived;  
} 


    system("pause"); 
} 

在一個空白行的開頭的文件實在是太多了。我如何刪除它們?

回答

0

如果InternetReadFile()實際讀取4096個字節,則表示存在緩衝區溢出。你不需要爲空,終止緩衝區,只寫緩衝區,達到使用write()方法,而不是<<運營商的實際讀取的字節數:

int main() 
{ 
    HINTERNET connect = InternetOpen("MyBrowser",0 ,0, 0, 0); 
    if (!connect) 
    { 
     cout << "Connection Failed or Syntax error"; 
     return 0; 
    } 

    HINTERNET OpenAddress = InternetOpenUrl(connect, "http://www.myurl.com/winapi.php", 0, 0, 0, 0); 
    if (!OpenAddress) 
    { 
     DWORD ErrorNum = GetLastError(); 
     cout << "Failed to open URL" << endl << " Error No: " << ErrorNum; 
     InternetCloseHandle(connect); 
     return 0; 
    } 

    ofstream data("output.txt"); 
    if (!data) 
    { 
     cout << "Failed to open txt file"; 
     InternetCloseHandle(OpenAddress); 
     InternetCloseHandle(connect); 
     return 0; 
    } 

    char DataReceived[4096]; 
    DWORD NumberOfBytesRead = 0; 

    do 
    { 
     if (!InternetReadFile(OpenAddress, DataReceived, 4096, &NumberOfBytesRead)) 
     { 
      DWORD ErrorNum = GetLastError(); 
      cout << "Failed to read from URL" << endl << " Error No: " << ErrorNum; 
      InternetCloseHandle(OpenAddress); 
      InternetCloseHandle(connect); 
      return 0; 
     } 

     if (NumberOfBytesRead == 0) 
      break; 

     data.write(DataReceived, NumberOfBytesRead);  
    } 
    while (true); 

    cout << "Finished reading from URL"; 
    system("pause"); 

    return 0; 
} 

雖這麼說,如果你仍然看到多餘的行出現在文件中,然後使用數據包嗅探器檢查PHP實際傳輸的數據,並確保它沒有發送額外的空行。如果是這樣,那麼你需要解決PHP方面的問題,而不是客戶端。