InternetReadFile返回结尾带有额外字符的文本
InternetReadFile returns text with extra characters at the end
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服务器读取文本文件到字符串,但是在读取字符串的末尾有一些额外的字符。我想问题出在文字的大小上,但是我想不出来。
例如,我想下载一个加密的文本,它会被损坏,像这样
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不应该出现在结尾
函数InternetReadFile不会null终止缓冲区,因此数组tmp的内容不是字符串,但您可以将其视为字符串。
行为未定义。
删除这一行:
buffer += (string)tmp;
可以使用字符串函数append的重载,该函数接受一个数组及其大小:
buffer.append( tmp , rSize );
正如2501所说,您没有考虑到NULL终止符,因此您想要做的事情将是这样的
DWORD rSize;
char tmp[2048+1];
string buffer;
while(InternetReadFile(hFile, tmp, 2048, &rSize) && rSize > 0)
{
tmp[rSize] = ' ';
buffer += (string)tmp;
}
相关文章:
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何从文本文件中读取数值,直到遇到字符类型?
- 如何在C++中反转文本文件中字符的顺序?
- 如何从代码本身向 wxwidgets 中的文本控件插入字符?
- 无法将整个文本文件复制到字符数组
- 在处理任何字符大小的模板中使用字符串文本
- 从我的 2DgridArray 中的文本文件中获取每个字符
- 从文本文件 (C++) 生成字符矩阵
- 如何在给定文本中用字符数组替换符号
- 如何在文本文件中间插入字符
- 将字符串文本分配给字符*:const_cast<字符 *> 与使用 char 数组
- 如何从文本文件中一次读取一个字符
- 字符* 文本消息[] 如何在内存中格式化?
- VS2013 字符文本不能作为 MSDN 的规范工作
- 为什么 C 中的字符文本大小与 C++ 中的字符文本大小不同
- 以本地化安全的方式比较C++中的字符串/字符和字符串/字符文本
- 在块中分配字符文本"if"
- C++编译时将字符串文本转换为多字符文本
- C++将字符串文本添加到字符文本