Запись в неформатированный двоичный файл с прямым доступом в C

Я пытаюсь использовать это твердое репо, чтобы проверить поток чисел на случайность ( https://github.com/reubenhwk/diehard). Это дает эти особенности для типа файла, который это читает:

Затем команда diehard запросит имя файла для проверки.

Этот файл должен иметь двоичный файл вида = "неформатированный",access="direct" объемом от 10 до 12 миллионов байт.

Это соглашения о файлах, специфичные для Фортрана, не так ли? Проблема в том, что я использую генератор lfsr для генерации моего случайного двоичного потока, и это в C. Я пытался просто сделать fputc двоичного потока в текстовый файл или .bin файл, но твердолобый, кажется, не принимает его.

У меня нет опыта работы с Fortran. Есть ли способ создать этот тип файла с помощью C? Должен ли я просто укусить пулю и заставить C вызвать подпрограмму fortran, которая создает файл? Вот мой код C для справки:

#include <stdio.h>

int main(void)
{
  FILE *fp;
  fp=fopen("numbers", "wb");

  const unsigned int init = 1;
  unsigned int v = init;
  int counter = 0;

  do {
    v = shift_lfsr(v);
    fputc( (((v & 1) == 0) ? '0' : '1'), fp);
    counter += 1;
  } while (counter < 11000000);
}

1 ответ

Решение

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

do {
  int b = 0;
  for (int i = 0; i < 8; i += 1) {
    v = shift_lfsr(v);
    b <<= 1;
    b |= (v & 1);
  }
  fputc(b, fp);
  . . .
Другие вопросы по тегам