2017-08-31 3 views
2

乱数の数値のストリーム(https://github.com/reubenhwk/diehard)をテストするためにこのdiehard repoを使用しようとしています。Cのフォーマットされていない直接アクセスバイナリファイルに書き込む

次にコマンド 頑固 をテストするファイルの名前を促します:それは読み込むファイルの種類のこれらの詳細を提供します。

このファイルは、form = "unformatted"、access = "direct"バイナリ ファイル(10〜1200万バイト)でなければなりません。

これらは、Fortranに固有のファイル規約です。問題は、私は私のランダムなバイナリストリームを生成するためにlfsrジェネレータを使用しています。それはCです。テキストファイルまたは.binファイルへバイナリストリームのfputcを実行しようとしましたが、diehardは受け入れられないようですそれ。

私はfortranに関する経験がありません。このファイルタイプをCで作成する方法はありますか?弾丸を噛んで、ファイルを作成するFortranサブルーチンをCに呼び出させるだけでいいですか?参考のために私の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); 
} 
+0

はい、使用しているコンパイラ(バージョン付き)の具体的な期待を見つける必要があります。いくつかの例をここで検索して見つけることができます。 – francescalus

答えて

3

バイナリファイルを作成しています。あなたの問題は、あなたは1バイトあたり1つのランダムなビットを書き、それをテキストに展開することです。 Diehardはあらゆるビットをランダムにしたいと考えています。したがって、書き込む前に一度に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); 
    . . . 
+0

これは動作しているようです。だから、書かれているのは、1または0のマルチビット 'char'ではなく、8ビットのランダムなシーケンスです。 – Davigor

+0

「ファイル」は一連のバイトです。 OSは、それらが読者によってどのように解釈されるかを知らないか、または気にしない。バイトはちょうど8ビットです。繰り返しますが、どのようにそれらを解釈するかはあなた次第です。ファイルにバイトを書き込むようにコンピュータに指示します。それらがキャラクタ、またはutf-8ストリームの一部、またはピクチャ内の色を表す場合、OSまたはCには関係ありません。 –

関連する問題