Windows中的二进制输出

时间:2011-07-05 17:16:29

标签: c windows file-io stdio

我写了一个程序,它读取二进制文件,对其内容进行一些处理,并将结果写入另一个文件。在Linux中它可以很好地工作,但在Windows中它不起作用;输出文件总是1KB ......

这是该计划的简化版本:

#include <stdio.h>

void copyFile(char* source, char* dest);

int main (int argc, char* argv[])
{
    if (argc != 3)
        printf ("usage: %s <source> <destination>", argv[0]);
    else
    {
        copyFile(argv[1], argv[2]);
    }
}


void encryptFile(char* source, char* destination)
{
    FILE *sourceFile;
    FILE *destinationFile;

    int fileSize;

    sourceFile = fopen(source, "r");
    destinationFile = fopen(destination, "w");

    if (sourceFile == 0)
    {
        printf ("Could not open source file\n");
        return;
    }

    if (destinationFile == 0)
    {
        printf ("Could not open destination file\n");
        return;
    }

    // Get file size
    fseek(sourceFile, 0, SEEK_END); // Seek to the end of the file
    if (ftell(sourceFile) < 4) 
        return; // Return if the file is less than 4 bytes
    fseek(sourceFile, 0, SEEK_SET); // Seek back to the beginning

    fseek(sourceFile, 0, SEEK_SET); // Seek back to the beginning

    int currentChar;

    while ((currentChar = fgetc(sourceFile)) != EOF)
    {
            fputc(currentChar, destinationFile);
    }

    fclose(sourceFile);
    fclose(destinationFile);
}

我很乐意为您提供有关该问题的更多详细信息,但我在Windows中编写C语言的经验并不多,我真的不知道问题出在哪里。

3 个答案:

答案 0 :(得分:7)

您应该使用b标志来fopen:

fopen(source, "rb")
fopen(destination, "wb");

据我所知,由于某些(脑损伤)主观决定,如果文件未以“二进制模式”打开,则在输入流上的win32到达0x1A时会触发EOF

修改

从未调查过,但有人告诉我,0x1A在DOS中被用作软EOF。

答案 1 :(得分:3)

好吧,你不是以二进制模式打开文件(使用“wb”和“rb”)。这在Linux上无关紧要,但它在Windows上运行,在文本模式下读取/写入文件时会转换某些字节。例如:

\r\n <--> \n 

\x1a  (Ctrl-Z) is treated as an EOF indicator

答案 2 :(得分:1)

你需要在fopen中使用“rb”和“wb”。