Открытие .dat файлов в C - PullRequest
       1

Открытие .dat файлов в C

1 голос
/ 25 апреля 2011

Я начинающий программист и только что задал вопрос об открытии файлов .dat в C.

Я получил файл .dat от друга, и это были инструкции по его открытию:

Первые 4 байта содержат целое число число, указывающее, сколько Последующие байты вы можете выбросить. Байт после этого содержит ASCII код для одной буквы в сообщение. Следующие 4 байта содержат количество ненужных байтов, которые вы можете выбросить, а затем прочитать следующее буква и т. д. Последний байт в файл будет последней буквой в сообщение.

Я просто ищу способ просмотреть отдельные байты файла; в этот момент я в замешательстве ...

Ответы [ 3 ]

2 голосов
/ 25 апреля 2011

Вы можете использовать fread() для чтения байтов из файла и fseek() для поиска другой позиции (например, для "выброса байтов").

Однако, чтобы разобрать первое число, вам нужно знать порядковый номер файла, если это не 4 символа ascii, представляющие цифры; в этом случае вы можете использовать atoi() для получения номера.

Вот пример кода:

unsigned char buf[4];
FILE *fp = fopen("test.dat", "rb");
while(!feof(fp)) {
    fread(buf, 4, 1, fp); // read 4 bytes
    int throw_away = do_some_magic_to_get_the_number(buf);
    fseek(fp, throw_away, SEEK_CUR); // skip the given number of bytes
    fread(buf, 1, 1, fp); // read one byte
    // your character is now in buf[0]
}
0 голосов
/ 25 апреля 2011

Предполагая, что вы читаете это на том же типе машины, на котором он был написан (то есть оба с прямым порядком байтов или оба с прямым порядком байтов), я, вероятно, напишу код примерно так:

uint32_t skip;

while (fread(&skip, sizeof(skip), 1, infile)) {
    fseek(infile, skip, SEEK_CUR);
    putchar(fgetc(infile));
}

Если вам нужно решить проблемы с порядком байтов, я бы, вероятно, использовал htonl для данных перед записью и ntohl для них после чтения. Однако есть много альтернатив - XDR и ASN.1 (чтобы назвать только пару) были предназначены для таких работ (хотя, я должен добавить, что оба из них почти наверняка излишни для задача под рукой).

0 голосов
/ 25 апреля 2011

Ознакомьтесь с этой документацией о том, как работают файловые операции.

unsigned char input buf[4]; 
FILE *fp = fopen("test.dat", "rb"); 
while(!feof(fp)) {   
  fread(buf, 4, 1, fp);   
  int skip_num = (int)buf; // should be able to cast since 4bytes = 1int and we have been told that this is an int.   
  for( ; skip_num >= 0; skip_num--) {}   
  fread(buf, 1, 1, fp); // This is the actual character do something with buf[0]. 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...