InternetReadFile()破坏了C中的下载

时间:2010-05-18 00:26:52

标签: c binary

我可以下载文本文档(.html,.txt等)但我无法下载图像或exe文件。我很确定这是因为我使用的是char,而这些文件是二进制文件。我知道在C#中我会使用一个字节。但是在这种情况下我会使用什么数据类型?

    char buffer[1];
    DWORD dwRead;
    FILE * pFile;
    pFile = fopen(file,"w");
    while (InternetReadFile(hRequest, buffer, 1, &dwRead))
    {
        if(dwRead != 1) break;
        fprintf(pFile,"%s",buffer);
    }
    fclose(pFile);

2 个答案:

答案 0 :(得分:4)

您的问题不是char,它使用的是带有%s的fprintf。 char可以保存所有字节值。当二进制数据块中包含\0(NULL)字符时,fprintf将在此时停止输出数据。

您希望在这种情况下使用fwrite

在Windows中,打开二进制文件时使用b说明符也很重要。

答案 1 :(得分:2)

由于您一次只读取一个字节到非空终止的缓冲区(因为它的大小为1),因此您需要一次输出一个字节,并使用“%c”作为格式字符串或使用putc(buffer[0], pFile)。就目前而言,您很容易受到缓冲区溢出的影响(因为可能会发生不好的事情!)。

如果您使用的是Windows平台,最好以二进制模式打开文件;因为二进制和文本模式之间没有区别,所以它对Unix没有任何影响。