Двоичный вывод в Windows - PullRequest
2 голосов
/ 05 июля 2011

Я написал программу, которая читает двоичный файл, выполняет некоторый процесс с его содержимым и записывает результаты в другой файл. В 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);
}

Я бы хотел рассказать вам подробнее о проблеме, но у меня нет большого опыта программирования на C в Windows, и я действительно не знаю, где может быть проблема.

Ответы [ 3 ]

7 голосов
/ 05 июля 2011

Вы должны использовать флаг b, чтобы открыть:

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

Я понимаю, что из-за некоторых ( повреждение мозга ) субъективных решений при достижении win32 значения 0x1A во входном потоке срабатывает EOF, если файл не открывается в "двоичном режиме".

EDIT

В никогда не смотрел на это, но кто-то говорит мне, что 0x1A использовался в DOS как мягкий EOF.

3 голосов
/ 05 июля 2011

Ну, вы не открываете файлы в двоичном режиме (используйте «wb» и «rb»).Это не имеет значения в Linux, но в Windows, который преобразует определенные байты при чтении / записи файла в текстовом режиме.Например:

\r\n <--> \n 

\x1a  (Ctrl-Z) is treated as an EOF indicator
1 голос
/ 05 июля 2011

Вам нужно использовать «rb» и «wb» с fopen.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...