在读取文件时在线计算文件的字节数

时间:2015-02-24 01:01:26

标签: c++ wininet

我正在尝试使用C ++控制台创建一个基本的“登录”系统。使用PHP确认用户信息,C ++将只检索PHP文件输出的数据。

我需要C ++代码在线读取文件的末尾并停止。我正在使用的代码在文件末尾计算额外的字节。

int main(){

HINTERNET connect = InternetOpenA("LoginCheckUserAgent 0.0.1v (compatible; harmless;)", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);

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

HINTERNET OpenAddress = InternetOpenUrlA(connect, "http://localhost/login/check.php?username=admin&password=admin", NULL, 0, INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_KEEP_CONNECTION, 0);

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

char DataReceived[4096];
DWORD NumberOfBytesRead = 0;
while (InternetReadFile(OpenAddress, DataReceived, 4096, &NumberOfBytesRead) && NumberOfBytesRead)
{
    cout << DataReceived;
}

InternetCloseHandle(OpenAddress);
InternetCloseHandle(connect);

cin.get();
return 0;

}

上面的代码给了我:abc123 |||||||||||等..(直到它达到4096字节) 我希望它能给我:abc123 我需要完全阅读“http://localhost/login/check.php?username=admin&password=admin”的内容而不需要额外的字节。我提供的代码尝试读取4096字节。

我知道我可以将4096设置为1或者其他东西,并且仅使用PHP来回复1个字节。但是我想让PHP脚本响应数据,这些数据总是在变化,所以我不能只假设我要处理的字节数。

我不需要任何人修复代码,我只想知道如何确定我将要读取的字节,然后让我的脚本将其读取到这些字节的末尾。所以我没有得到不必要的字节。

抱歉,如果我弄得一团糟。

1 个答案:

答案 0 :(得分:0)

您实际阅读的字节数在NumberOfBytesRead。因此,要终止字符串,只需要将\0写入数组中的该位置:

DataReceived[NumberofBytesRead] = '\0';

现在,它正在使 room 读取4096字节,但当然只能读取发送的数量。 NumberOfBytesRead告诉您实际读取的字节数,而不是您请求的数字。

注意:根据具体情况,传输可能会分解成碎片,因此即使数据是在单个“块”中发送的,也可能会在几次连续读取尝试中收到。

通常你想要为你的数据加上它的长度前缀,所以你可以读(比方说)一个4字节的标题,告诉你余数的长度,并知道继续阅读,直到你收到整个事情(或给起来,比如如果花了太长时间。)