yagami_md Ответов: 2

Читать файл как двоичный файл с помощью программирования на языке Си?


hy друзья
Я просто хочу, как работает файл в программировании на Си, и хочу знать, как я могу читать файл (возможно, это был ввод изображения или txt-файл )
-когда я это сделал, когда (c!=EOF) и c =fgetc(файл)
программирование на языке Си считывает байт файла как символ это означает ASCII
но я хочу, чтобы мой файл читался только двоичным 0 или 1 ?
как я могу это сделать?
- преобразуйте все входные файлы в двоичные (все байты в двоичные) и сохраните их в другой двоичный файл
что ты предлагаешь?
уже не первый раз

Что я уже пробовал:

Мне нужна идея только для обсуждения

Sergey Alexandrovich Kryukov

Вопрос действительно имел бы смысл, если бы вы объяснили 1) Цель, 2) проблему.
Просто читать файл вряд ли имеет смысл. Сама идея "обращения" ошибочна. Нет такого понятия, как "не двоичный" файл; все файлы являются "двоичными". Вы просто читаете необработанные данные, вот и все; вам нечего "конвертировать". Но чтение-к какой структуре данных? Это зависит от цели и некоторых других факторов.
—СА

yagami_md

проблема :
в C, когда вы читаете байт ты действительно читал в ASCII байта это означает 0 в ASCII читается как 48 в nteger и 1 в формате ASCII, читать 49 в целое число (в десятичной системе)
моя цель заключается в том, что когда я делал fgetc (файл), я читал ascii
Я не хочу читать так, я хочу читать 0 как (b7b6b5b4b3b2b1b0), потому что у нас есть 255 ASCII ca, прочитанных в файле с использованием c
если ты не понимаешь я могу объяснить больше друг

Sergey Alexandrovich Kryukov

То, что вы говорите, неправда. Даже близко.

Я даже не знаю, как это объяснить. Байт не имеет ничего общего с ASCII. ASCII-это кодировка текста (и только для кодовых точек ниже 128). Когда вы читаете файл, Вы читаете байты, а не текст. Извините, вы заблудились. Это ты не понимаешь. Нет никаких проблем с чтением этих байтов. Как правило, чтобы понять запись или чтение файла, лучше всего было бы забыть о том, что char или string вообще существуют. Позже вы узнаете, как объединить текстовые данные с остальными. Идея такова: вы определяете некоторую структуру, получаете ее двоичный размер и записываете все это в виде буфера; и симметрично читаете, когда вам нужно читать...

—СА

2 Ответов

Рейтинг:
19

Dave Kreskowiak

Нет такой вещи, как чтение немного, или то, что вы называете "двоичным". Самое низкое, что вы можете получить, - это чтение одного байта. Оттуда вы должны разобрать байт, чтобы получить нужные битовые значения, используя битовые маски и логические операторы и / или сдвига.


yagami_md

вы имеете в виду, если у меня есть входной файл в виде txt ={aabbcde)
Я должен преобразовать все в другой файл, содержащий двоичный код всех (8char * 8 (ascii кодирование на 8 бит макс. 255in десятичное

Dave Kreskowiak

В этом не было никакого смысла.

Все файлы могут быть прочитаны как байты. ASCII не имеет к этому никакого отношения. Это кодировка, как байты интерпретируются, чтобы сформировать текст.

Чтение байта, а затем получение значений каждого бита байта не имеет ничего общего с ASCII.

Вы не объяснили, что подразумеваете под "преобразованием входного файла в двоичный "и"сохранением их в другой двоичный файл". В этом нет никакого смысла.

Вы спрашиваете, как прочитать байты файла, получить значения каждого бита, 0 или 1, а затем записать значения 0 и 1 в текст в другой файл?? По сути, создание файла, который вы можете открыть в блокноте, который не будет показывать ничего, кроме 1 и 0??

yagami_md

P5 # Создается imlib, которые
512 512
255
¢¢¢¡¢£¡¦¢¢ ›£ ›œ¡¡šœš™š˜œššœšž› ž§ ¦¦¥¦¬«¯­ª¬¬§¯¨§¢¡“”™Œ‚wvjaa^\Xag`heiiiihnnlkihmmmljjlnmkmmnnlhjjlmovoqvywpzyz}zy|{‚{z„ƒ„‡€ƒƒ‡‰„†ƒƒ€‚†~~…‚ƒ€ƒ€‡…ˆ†€†‚‡……†‡„‡„ˆ†„……ˆ…††„…ƒ„…‡‰†…ƒ…ƒ‡ˆ„‡ˆ‰…Šˆ‡…‰‡ˆ„…Œ„ƒ‹†ƒ„ƒ~ƒƒ„ƒ„ƒ€‡……‡ƒ„……ƒ…‚ƒƒ…ˆ†„‡„‡†Šƒƒƒ……ŠŠŽ†„„€€…†„†…ƒ€ƒ„~‚‡†~‚ƒ†~„ƒ€ƒƒ}€‚~€„~y||ywzywuroqsifghptvz„‡‹Œ‘’—™˜™ŸŸŸ£ž¢¡››””™•š——›—›˜œššŸŸœžš™—™—š˜š™˜™˜——žšš˜˜™šžžššœ   œœ˜››ž±ÀÆÎÐÓÓÔ×ÚÚÚÚÜØÓÌÀ¬˜zkjeghoiqtuwuwvy{ywux}yv{z}€yw{vy|{xzyy{z|v|~|~~{{|}vv€z~~~‚|~~z‚|~w{rytwvsx|‰¢¨©«ª›€¢¢¢¡¢£¡¦¢¢ ›£ ›œ¡¡šœš™š˜œššœšž› ž§ ¦¦¥¦¬«¯­ª¬¬§¯¨§¢¡“”™Œ‚wvjaa^\Xag`heiiiihnnlkihmmmljjlnmkmmnnlhjjlmovoqvywpzyz}zy|{‚{z„ƒ„‡€ƒƒ‡‰„†ƒƒ€‚†~~…‚ƒ€ƒ€‡…ˆ†€†‚‡……†‡„‡„ˆ†„……ˆ…††„…ƒ„…‡‰†…ƒ…ƒ‡ˆ„‡ˆ‰…Šˆ‡…‰‡ˆ„…Œ„ƒ‹†ƒ„ƒ~ƒƒ„ƒ„ƒ€‡……‡ƒ„……ƒ…‚ƒƒ…ˆ†„‡„‡†Šƒƒƒ……ŠŠŽ†„„€€…†„†…ƒ€ƒ„~‚‡†~‚ƒ†~„ƒ€ƒƒ}€‚~€„~y||ywzywuroqsifghptvz„‡‹Œ‘’—™˜™ŸŸŸ£ž¢¡››””™•š——›—›˜œššŸŸœžš™—™—š˜š™˜™˜——žšš˜˜™šžžššœ   œœ˜››ž±ÀÆÎÐÓÓÔ×ÚÚÚÚÜØÓÌÀ¬˜zkjeghoiqtuwuwvy{ywux}yv{z}€yw

посмотрите " это когда я открываю файл (например, изображение ) с помощью notpad !!!!! Я вижу только AScii

Dave Kreskowiak

Aaaaaannnnnddddd, что абсолютно ничего не значит для меня. АГЕЙНС, что вы хотите сделать с этим файлом?

Рейтинг:
12

Jochen Arndt

Содержимое файла всегда двоично, используя 8-бит (байт) в качестве наименьшей единицы измерения. Тип представляемых данных зависит от типа файла и должен обрабатываться соответствующим образом приложением при чтении и записи файла.

То ссылка на fgetc - C++ [^ функция] возвращает один байт, считанный из файла в виде int. Причина возврата int вместо байтового типа типа char или unsigned char является ли это дополнительным возвращаемым значением для ошибок и конца файла (EOF).

Так что вам не нужно никакого обращения. Но вам может понадобиться интерпретировать данные, чтобы подготовить их к использованию или просто распечатать.

Если у вас нет информации о типе файла, вы можете распечатать двоичное содержимое:

#include <stdio.h>

int main(int argc, char* argv[])
{
    int c;
    FILE *f;
    if (argc > 1)
    {
        f = fopen(argv[1], "rb");
        if (f)
        {
            do
            {
                c = fgetc(f);
                if (EOF != c)
                    printf("%02X ", c);
            } while (EOF != c);
            fclose(f);
        }
    }
    printf("\n");
    return 0;
}


Если вы хотите напечатать каждый байт в виде битовой последовательности, вы должны написать соответствующую функцию (вызовите ее вместо printf функция в приведенном выше примере):
/* Print byte as bit sequence with MSB first */
void print_byte_as_bits(int byte_value)
{
    int i;
    if (byte_value >= 0 && byte_value < 256)
    {
        for (i = 0; i < 8; i++)
        {
            printf("%c ", (byte_value & 0x80) ? '1' : '0');
            byte_value <<= 1;
        }
    }
    else
        printf("[Not a byte: %X]", byte_value);
}


yagami_md

думаю, вы очень друг