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

Counting bytes of file online while reading it

我正在尝试使用 C++ 控制台创建一个基本的 "Login" 系统。使用 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 脚本响应始终变化的数据,因此我不能只假设我将要处理的字节数。

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

抱歉,如果我造成任何混淆。

您实际读取的字节数在NumberOfBytesRead中。所以,要终止你的字符串,你只需要写一个 [=12=] 到数组中的那个位置:

DataReceived[NumberofBytesRead] = '[=10=]';

所以现在,它正在 room 读取 4096 字节,但当然只读取发送的字节数。 NumberOfBytesRead 告诉您 实际上 读取了多少字节,而不是您请求的字节数。

注意:根据情况,传输可能会被分解成多个部分,因此即使数据是在单个 "chunk" 中发送的,也可能会在多次连续的读取尝试中收到。

通常你想在你的数据前面加上它的长度,这样你就可以读取(比如说)一个 4 字节 header 告诉你余数的长度,并且知道继续阅读直到你收到整个事情(或者放弃,比如花太长时间)。