Подтвердить что ты не робот

Чтение/запись в двоичные файлы в C

Есть ли у кого-нибудь пример кода, который может записываться в двоичный файл. А также код, который может читать двоичный файл и выводить на экран. Глядя на примеры, я могу записать в файл ok Но когда я пытаюсь читать из файла, он не выводится правильно.

4b9b3361

Ответ 1

Чтение и запись двоичных файлов в значительной степени аналогично любому другому файлу, единственное отличие заключается в том, как вы его открываете:

unsigned char buffer[10];
FILE *ptr;

ptr = fopen("test.bin","rb");  // r for read, b for binary

fread(buffer,sizeof(buffer),1,ptr); // read 10 bytes to our buffer

Вы сказали, что можете прочитать его, но он не выводит правильно... имейте в виду, что когда вы "выводите" эти данные, вы не читаете ASCII, поэтому не нравится печатать строку на экране:

for(int i = 0; i<10; i++)
    printf("%u ", buffer[i]); // prints a series of bytes

Запись в файл почти такая же, за исключением того, что вы используете fwrite() вместо fread():

FILE *write_ptr;

write_ptr = fopen("test.bin","wb");  // w for write, b for binary

fwrite(buffer,sizeof(buffer),1,write_ptr); // write 10 bytes from our buffer

Так как мы говорим о Linux, там есть простой способ сделать проверку работоспособности. Установите hexdump в свою систему (если она еще не указана) и выгрузите файл:

[email protected]:~/C$ hexdump test.bin
0000000 457f 464c 0102 0001 0000 0000 0000 0000
0000010 0001 003e 0001 0000 0000 0000 0000 0000
...

Теперь сравните это с вашим выходом:

[email protected]:~/C$ ./a.out 
127 69 76 70 2 1 1 0 0 0

hmm, возможно, измените printf на %x, чтобы сделать это немного яснее:

[email protected]:~/C$ ./a.out 
7F 45 4C 46 2 1 1 0 0 0

Эй, смотри! Теперь данные соответствуют *. Удивительно, мы должны читать двоичный файл правильно!

* Обратите внимание: байты просто заменяются на выходе, но эти данные верны, вы можете настроить для этого типа

Ответ 2

Я вполне доволен своим решением "создать слабую булавку". Возможно, это поможет людям, которым нужен очень простой пример ввода-вывода двоичных файлов.

$ ls
WeakPin  my_pin_code.pin  weak_pin.c
$ ./WeakPin
Pin: 45 47 49 32
$ ./WeakPin 8 2
$ Need 4 ints to write a new pin!
$./WeakPin 8 2 99 49
Pin saved.
$ ./WeakPin
Pin: 8 2 99 49
$
$ cat weak_pin.c
// a program to save and read 4-digit pin codes in binary format

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

#define PIN_FILE "my_pin_code.pin"

typedef struct { unsigned short a, b, c, d; } PinCode;


int main(int argc, const char** argv)
{
    if (argc > 1)  // create pin
    {
        if (argc != 5)
        {
            printf("Need 4 ints to write a new pin!\n");
            return -1;
        }
        unsigned short _a = atoi(argv[1]);
        unsigned short _b = atoi(argv[2]);
        unsigned short _c = atoi(argv[3]);
        unsigned short _d = atoi(argv[4]);
        PinCode pc;
        pc.a = _a; pc.b = _b; pc.c = _c; pc.d = _d;
        FILE *f = fopen(PIN_FILE, "wb");  // create and/or overwrite
        if (!f)
        {
            printf("Error in creating file. Aborting.\n");
            return -2;
        }

        // write one PinCode object pc to the file *f
        fwrite(&pc, sizeof(PinCode), 1, f);  

        fclose(f);
        printf("Pin saved.\n");
        return 0;
    }

    // else read existing pin
    FILE *f = fopen(PIN_FILE, "rb");
    if (!f)
    {
        printf("Error in reading file. Abort.\n");
        return -3;
    }
    PinCode pc;
    fread(&pc, sizeof(PinCode), 1, f);
    fclose(f);

    printf("Pin: ");
    printf("%hu ", pc.a);
    printf("%hu ", pc.b);
    printf("%hu ", pc.c);
    printf("%hu\n", pc.d);
    return 0;
}
$

Ответ 3

Это пример для чтения и записи двоичного видео файла jjpg или wmv.   FILE * fout;   ФАЙЛ * плавник;

Int ch;
char *s;
fin=fopen("D:\\pic.jpg","rb");
if(fin==NULL)
     {  printf("\n Unable to open the file ");
         exit(1);
      }

 fout=fopen("D:\\ newpic.jpg","wb");
 ch=fgetc(fin);
       while (ch!=EOF)
             { 
                  s=(char *)ch;
                  printf("%c",s);
                 ch=fgetc (fin):
                 fputc(s,fout);
                 s++;
              }

        printf("data read and copied");
        fclose(fin);
        fclose(fout);

Ответ 4

Этот вопрос связан с вопросом Как написать файл двоичных данных на C и построить его с помощью Gnuplot от CAMILO HG. Я знаю, что настоящая проблема состоит из двух частей: 1) записать файл двоичных данных, 2) построить его с помощью Gnuplot.

На первую часть очень четко ответили, поэтому мне нечего добавить.

Во-вторых, самый простой способ - отправить людей к руководству по Gnuplot, и я уверен, что кто-то найдет хороший ответ, но я не нахожу его в Интернете, поэтому я собираюсь объяснить одно решение (которое должно быть в реальной жизни). вопрос, но я новый в stackoverflow и не могу ответить там):

После записи файла двоичных данных с использованием fwrite(), вы должны создать очень простую программу на C, читатель. Читатель содержит только ту же структуру, что и писатель, но вместо него вы используете fread() fwrite(). Поэтому сгенерировать эту программу очень легко: скопируйте в файл reader.c часть записи исходного кода и измените запись на чтение (и "wb" для "rb"). Кроме того, вы можете включить некоторые проверки данных, например, если длина файла правильная. И, наконец, ваша программа должна напечатать данные в стандартном выводе, используя printf().

Для ясности: ваша программа работает так

$ ./reader data.dat

X_position Y_position  (it must be a comment for Gnuplot)*

1.23 2.45

2.54 3.12

5.98 9.52

Окей, с этой программой в Gnuplot вам нужно только передать стандартный вывод считывателя на Gnuplot, что-то вроде этого:

plot '< ./reader data.dat'

Эта строка запускает программу чтения программ, а выход связывается с Gnuplot и выводит данные.

* Поскольку Gnuplot собирается читать выходные данные программы, вы должны знать, что Gnuplot может читать и строить, а что нет.