17

数週間前、いくつかのファイルを読み込むために std::ifstream を使用していましたが、ファイルが 4GB を超えていたため、開くとすぐに失敗しました。当時、なぜ 32 ビットのファイル サイズに制限されたのかについて適切な答えを見つけることができなかったので、ネイティブ OS API を使用して独自に作成しました。

それで、私の質問: std::ifstream/std::ostream (IE: 標準 c++) を使用してサイズが 4GB を超えるファイルを処理する方法はありますか

編集: VC 9 コンパイラ (Visual Studio 2008) の STL 実装を使用します。EDIT2:4GBを超えるファイルサイズをサポートする標準的な方法が必要です。

4

5 に答える 5

14

どうやらそれはoff_tライブラリによってどのように実装されているかに依存します。

#include <streambuf>
__int64_t temp=std::numeric_limits<std::streamsize>::max();

現在の最大値を示します。

STLportはより大きなファイルをサポートします。

于 2008-11-16T09:01:18.000 に答える
5

数年前、Linux で gcc を使用してこの問題に遭遇しました。OS は大きなファイルをサポートし、C ライブラリ (fopen など) はそれをサポートしていましたが、C++ 標準ライブラリはサポートしていませんでした。正しいコンパイラ フラグを使用して C++ 標準ライブラリを再コンパイルする必要があることがわかりました。

于 2008-11-16T13:52:18.783 に答える
2

標準の観点からは、これを妨げるものは何もありません。ただし、実際には、ほとんどの 32 ビットの実装では 32 ビットを使用していstd::size_tます。現在、C++ 標準は、C++ 標準ライブラリの標準アロケータがサイズ量として std::size_t を使用することを義務付けています。したがって、コンテナー、文字列などのストレージは 2^32 バイトに制限されます。の状況は別の可能性がstd::off_tあります。そこで何が起こっているのか正確にはわかりません。

OS のネイティブ API を直接使用するか、それをラップするライブラリを使用する必要があります。これを行うには、実装に大きく依存する標準ライブラリの実装を信頼する必要はありません。

于 2008-11-16T14:41:47.483 に答える
1

少なくとも VS2013 では、C++ 標準ファイルストリームは大きなファイル (>4GBytes) でうまく機能します。

私はVS2013でテストしました(update3を使用)。

int64_t file_pos = 4LL * 1024 * 1024 * 1024 + 1;
file.seekp( file_pos, SEEK_SET );
assert( file );
cout << "cur pos: " << file.tellp() << endl; // the output is: 4294967297(4GB + 1)

次のリンクは、それがバグであり、修正されていることを確認するための追加のリンクです: https://connect.microsoft.com/VisualStudio/feedback/details/627639/std-fstream-use-32-bit-int-as-pos- type-even-on-x64-platform

略して: Stephan T. Lavavej (Visual C++ Libraries Developer) は言いました

これは修正済みで、修正は VC11 で利用できるようになる予定です。そのため、大きなファイルのサポートは現在 (x86/x64 プラットフォームに関係なく) 正しく機能するはずです。

于 2015-06-03T04:15:26.140 に答える
0

標準のC++のみを使用するのをやめることができる場合は、boost::iostreamsに興味があるかもしれません。

于 2009-11-18T13:36:31.940 に答える