2016-09-13 4 views
1
HINTERNET hInternet, hFtpSession, hFile; 

    hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); 
    hFtpSession = InternetConnect(hInternet, FTPHOST, INTERNET_DEFAULT_FTP_PORT, 
     FTPUSER, FTPPASS, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0); 
    hFile = FtpOpenFile(hFtpSession, argv[1], GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0); 

    DWORD rSize; 
    char tmp[2048]; 
    string buffer; 

    while(InternetReadFile(hFile, tmp, 2048, &rSize) && rSize > 0) 
    { 
     buffer += (string)tmp; 
    } 

    cout << buffer; 

    InternetCloseHandle(hFile); 
    InternetCloseHandle(hFtpSession); 
    InternetCloseHandle(hInternet); 

У меня есть эта небольшая программа для чтения текстового файла с FTP-сервера в строку, но в конце строки чтения есть дополнительные символы. Я думаю, проблема связана с размером текста, но я не могу понять это.InternetReadFile возвращает текст с дополнительными символами в конце

Например, я хочу, чтобы загрузить зашифрованный текст будет поврежден, как этот

MIICIDANBgkqhkiG9w0BAQEFAAOCAg0AMIICCAKCAgEAp2q+92EQPncY0sN6SMTC0yh05GpZ 
FUEGATvUx/zcUrzdDTva5JKz0MztuCn3lnHmaUB6L97w8fuVOhJjj90ItH4FdUk4R9m50son 
DSZ4ad5ZKi7WE7GApIq21vgM0zoG5sr0Xb6X41IQgvYF7i9nX4zKO2znRyD3uzBqkqkhWzbS 
HI2euCdhmXfx2az0ynNKrcnQINaWowipc0LrW0Q9PWI1McCs4V5sz8GkBMpKENb3m/LBlSqz 
TboC/9hiD9Yfclvk3wFeNGvsnUUDpwZipF9cBMVzmfyjA1gBDNLV8qcTXSortHaGeHdLpqIg 
Qn3SpDol8gPRis7A7Hy4KjRS8Y/iZa8Nv9EmEeful6u3IHY0Qror/wOeST5WhaTynVBT0wgP 
6GSMWsofwA3NttsFCw55z5c8GBEGP6Uo+jP/rdiYvednT0iV8Grp+XJ6zMFqYlVcLqAzQWLw 
dfqve/lr8+OKfR9WvG6hvrVduTnoy+LBFF/QEVxAlZqymlXMm/hcO/TUoE1Kmon6FwID4Mek 
nV1eb1aCmUIzxFHtPkMO0KFitmxa5EGwAFHRAjXrp2lUHIQSaWwVnsfoQgmrG9ux2I27w+WR 
8kFdkqWrutFz2xn6ovVwla7Oj0iL2f9azNO2Z2KT/sBPwGmI67M9Ceih0YLD0w7Woy32H2aM 
mIeK368CARE= 
8 

8-не должно быть там в конце.

+0

'string' не является C-типом. Пожалуйста, не помещайте этот вопрос как 'C'. Кроме того, вы не можете перегружать операторов в C (например, 'buffer + = ...'). Этот вопрос не имеет ничего общего с C. Пожалуйста, отредактируйте вопрос и отпустите тег 'C'. –

ответ

4

Функция InternetReadFile не отменяет нулевой буфер, поэтому содержимое массива tmp не является строкой, но вы относитесь к нему как к такому.

Поведение не определено.

Удалить эту строку:

buffer += (string)tmp; 

Вместо использования перегрузку функции строки Append, которая принимает массив и его размер:

buffer.append(tmp , rSize); 
+0

Я вижу, но тогда как я могу наложить буфер на строку или что мне делать? – Paralyz3d

+0

@ Paralyz3d См. Обновление. – 2501

2

Как 2501 сказал, что вы не принимая во внимание NULL-терминатор, поэтому то, что вы хотели бы сделать, было бы примерно таким:

DWORD rSize; 
char tmp[2048+1]; 
string buffer; 

while(InternetReadFile(hFile, tmp, 2048, &rSize) && rSize > 0) 
{ 
    tmp[rSize] = '\0'; 
    buffer += (string)tmp; 
} 
Смежные вопросы