Чтение "чистых" байтов в C - PullRequest
1 голос
/ 05 марта 2012

Мне было интересно ... как вы читаете байты по одному из двоичного файла? В качестве примера, я хотел бы читать байты по одному из некоторого двоичного файла, а затем записывать эти точные байты в некоторый выходной файл (в основном, очень базовая реализация команды cp). Мой текущий код C выглядит так:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char**argv)
{
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <output file>\n", argv[0]);
        return 1;
    }

    FILE *outfile;
    outfile = fopen(argv[1], "w");

    unsigned char c;
    char temp;
    int tracker = 0;
    // Use temp because unsigned char will never be EOF
    while ((temp = getchar()) != EOF) {
        c = (unsigned char) temp;
        fprintf(outfile, "%c", c);
    }
fclose(outfile);
return 0;
}

Я запускаю программу так: ./main output.au < sample.au (.au - аудиофайл)

Тем не менее, все, что я получаю в файле output.au, это кучка «^ @», повторяемая снова и снова. Я могу нормально воспроизводить аудиофайл sample.au, но не output.au. Я также (несколько бессмысленно) сделал diff для двух файлов, и, как и ожидалось, они получаются по-разному.

Помощь? Спасибо! -kstruct

UPDATE Спасибо всем за ответ .. мой код теперь выглядит так:

outfile = fopen(argv[1], "wb");

int c;
while ((c = getchar()) != EOF) {
    fprintf(outfile, "%c", c);
}

Ответы [ 3 ]

7 голосов
/ 05 марта 2012

getchar() возвращает int.Вы присваиваете int переменной типа char, тем самым теряя информацию. Не делайте этого.

Объявите temp как int и избавьтесь от актеров.

1 голос
/ 05 марта 2012

Есть несколько вещей, которые нужно исправить: 1) Откройте STDIN как двоичный файл. freopen(NULL, "rb", stdin); 2) Откройте файл как: fopen (argv [1], "wb"); 3) температура должна быть типа int .

0 голосов
/ 05 марта 2012

внести следующие исправления:

- outfile = fopen(argv[1], "w");
+ outfile = fopen(argv[1], "wb");


- c = (unsigned char) temp;
+ c = (unsigned char) (char) temp;
...