Iは、Cプログラミング言語ブックカーニハンとリッチーのページ170に記載されているように、低レベルのI/O read
とwrite
システムは、コール使用するいくつかのコードを持っています。 関数のプロトタイプは、大量のデータを読み書きするために、より大きなFORTRANベースのプログラムによって呼び出され、これらのread
とwrite
を使用しています。このCローレベル読み出し書き込み機能64ビット相当?
int n_read = read (int fd, char *buf, int n)
int n_read = write (int fd, char *buf, int n)
今2つの.cファイルです。
Cコードは、関数名の後にアンダースコアを有し、かつ、参照渡し、いかなる種類の#include
で、単にこれです:
int read_ (int *descriptor, char *buffer, int *nbyte)
{
return (read(*descriptor, buffer, *nbyte));
}
int write_ (int *descriptor, char *buffer, int *nbyte)
{
return (write(*descriptor, buffer, *nbyte));
}
と大きなFORTRANベースのプログラムでは、この
ようなことを行いますINTEGER nbyte
COMPLEX*16 matrix(*)
INTEGER READ, WRITE
EXTERNAL READ, WRITE
status = READ(fd, matrix, nbyte)
if (status .eq. -1) then
CALL ERROR('C call read failure')
stop
endif
あなたがすでに推測しているように、これはのnbyteの値が2^31未満で正常に動作します。私は、データの2 GB以上を読み込む必要がありますので、私はnbyteが長整数とINTEGER FORTRANにおける* 8する必要があります。 unistd.hとfeatures.hによって提供さlseek64があるよう
は同等read64とwrite64は、ありますか?
これを再コードする最良の方法は何ですか? 私はfreadとfwriteを使うべきですか? はfread()
からFILE *stream
と同じ低レベルwrite
からint fd
のですか?
私の要件は、100〜500ギガバイトまたはすべてnbyte
アムiの値のためのものである12桁を有する整数で、最大値を可能にするために、8バイトの長整数を通過することができるされています何を得るか、または現在「システムコール」として識別されread
とwrite
を用いて負け?これは何を意味するのでしょうか?
すべてが読み込まれるまで、小さなチャンクで連続して読み込むのはどうですか? –
K&R Cは、歴史的な理由から興味がある場合を除いて、今学ばなければならないものではありません。物事の多くは、陳腐な、時代遅れ、または間違って今日は間違っています。例えば、 'read()'関数のためのRTFMしかなければ、Leandrosがあなたに与えた宣言を見つけて、おそらくあなた自身の問題を解決したでしょう。 –
それはせいぜい醜い回避策@WeatherVaneであろう。 Fortran側でCコードとのインタフェースが取れない場合は、まだ注意が必要です。 –