2010-05-18 211 views
1

我可以下载文本文件(.html,.txt等),但我无法下载图像或exe文件。我很确定这是因为我使用了一个字符,而这些文件是二进制文件。我知道在C#中我会使用一个字节。但在这种情况下我会使用哪种数据类型?InternetReadFile()损坏下载文件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); 
+0

使用大于1字节的缓冲区可能效率更高。 – 2010-05-18 03:17:19

回答

4

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

你想在这种情况下使用fwrite

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

+2

哦,你是对的。我删除了我的答案。我认为OP也需要''fopen()''而不是'w',否则Windows编译器会在编写二进制文件时帮助翻译(和损坏)它们。 – 2010-05-18 00:34:27

+0

正是我需要的。 – Lienau 2010-05-18 00:50:28

2

由于您每次读一个字节到该IS NOT NULL终止的缓冲液(因为它的大小为1),则需要输出一个字节以“%c”一个时间作为格式串或使用putc(buffer[0], pFile) 。就目前而言,你容易受到缓冲区溢出的影响(因为可能发生坏事!)。

如果您在Windows平台上,以二进制模式打开文件是个好主意;它在Unix上不会造成危害,因为二进制和文本模式没有区别。