2012-01-16 7 views
5

Cを使用して2GB以上のファイルにアクセスする必要があります。プログラムの実行中に可変バイト数がファイルから読み込まれ、次の位置の場所が保存されます。プログラムの次回の実行中に、ファイルの位置が読み取られ、その位置から始まるいくつかのバイトが読み取られます。Cで大きなファイルにアクセス

ファイルが新しいファイルにコピーされることで、ファイルが既に圧縮されていることがあります(コピーはそれを行う唯一の方法だと思います)。この方法で削除されたバイト数も保存されます。

別のファイルとの同期のために、ファイルの現在の位置を元の位置から知る必要があります。これはちょうど(current_offset + deleted_bytes)であるため、これは簡単なはずです。

fseekはファイルを2GBに制限するlong intインデックスのみを使用し、fsetposは数値ではなく、前後に変換することのできないfpos_t構造体を使用します1に。私は理想的な解決策になる、ファイルの位置決めに長いlong intインデックスを使用する方法については知らない。

私は何をしますか?

+2

どのプラットフォームですか? 'ftello()'と 'fseeko()'はオプションです。 –

+0

ftelloとfseekoはPOSIX.1に準拠しますが、> 2GBもファイルシステムに依存した問題です。 –

答えて

6

ウィンドウでは、_lseeki64()を使用して64ビットシークを行うことができます。 Linuxでの互換性のため

、あなたはまた、コンパイル時に-D_FILE_OFFSET_BITS=64を追加し、あなたのヘッダーの1つで行うことができます。

#ifdef __MINGW32__ // or whatever you use to find out you're compiling on windows 
#define lseek _lseeki64 
#endif 

その後、いつものようにどこでもlseek()を使用しています。これは、ウィンドウが_FILE_OFFSET_BITSフラグを無視し、linuxはlseekの再定義を認識しないために機能します。

あなたがFILE*バージョンを好む場合_fseeki64()もありますし、同等の64ビットtell()ftell()機能があまりにも(_telli64()_ftelli64())があります。

+0

私はそれが私の必要と思うものです。ありがとう! – user1151125

+0

ようこそ。移植性を高めるためのもう一つの注意 - 私はWindowsが 'off_t'を宣言しているかどうか覚えていないので、ウィンドウ上で' #define off_t __int64'も必要になるかもしれません。( 'lseek()'インターフェース(http ://www.kernel.org/doc/man-pages/online/pages/man2/lseek.2.html))。しかし、私は100%は確信していません - おそらく 'off_t'は今どこかで定義されています。 –

+0

@TimothyJones Windowsで_file_offset_bitsをどのように設定しますか?私はVisual studio 2008から32bit Windows7マシンでコンパイルしています。私はこの例に従おうとしました。http://coding.derkeiler.com/Archive/C_CPP/comp.lang.c/2006-12/msg03560。htmlが、私は次のエラーc2371を得る: 'off_t':再定義;異なる基本タイプ – savi

1

等、fopenを行うコンパイルフラグ-D_FILE_OFFSET_BITS=64を、追加fseekoff_tは、サイズが2 GBを超えるファイルの操作のために、64ビットと使用可能になります。詳細については、Large File Support in Linuxを参照してください。

+0

優れたソリューション。残念ながら、私はWindowsとVisual Studioを使用していると述べていたはずです。 – user1151125

+0

私はコンパイラ固有の解決策は考えていないと思います。私はVisual Studioのドキュメントを検索し、Windowsで64ビットインデックスを使用するSetFilePointerを見つけました。私は自分のコードをそれよりも移植性の高いものにすることを望んでいました。多分、#ifdefを使ってどのプラットフォーム上にあるのかを検出し、コンパイラ指令などの全リストを知る方法を学ぶ必要があるかもしれません。 – user1151125

+0

Linux/OS Xユーザーにとって便利な場合に備えて、回答を残しておきます。 Makefileを使用すると、プラットフォームごとにコンパイルオプションを決定できます。 –

関連する問題