Hledá a čtení velkých souborů v aplikaci Linux C ++

hlasů
12

I am běh do integer overflow pomocí standardního ftell a fseek možnosti uvnitř G ++, ale asi jsem se mýlil, protože se zdá, že ftell64 a fseek64 nejsou k dispozici. Byl jsem vyhledávání a mnoho webových stránek se zdá odkazovat pomocí lseek s off64_t datový typ, ale nenašel jsem žádné příklady odkazující něco rovnající se fseek . Právě teď jsou soubory, které čtu ve jsou 16GB + CSV souborů s očekáváním nejméně dvojnásobek.

Bez jakýchkoliv externích knihoven, co je nejjednodušší způsob k dosažení podobnou strukturu jako u fseek / ftell páru? Moje žádost právě teď pracuje s použitím standardního GCC / g ++ knihovny pro 4.x.

Položena 23/06/2009 v 23:43
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
24

fseek64 je funkce C. Aby byl k dispozici, budete muset definovat _FILE_OFFSET_BITS = 64 před včetně systémové záhlaví, která budou více či méně definují fseek být skutečně fseek64. Nebo to v argumentech kompilátor gcc např -D_FILE_OFFSET_BITS = 64 ....

http://www.suse.de/~aj/linux_lfs.html má velkou overviw o podporu velkých souborů na Linuxu:

  • Zkompiluje Vaše programy s "gcc -D_FILE_OFFSET_BITS = 64". To přinutí všechny přístupové soubor volání používat bitové varianty 64. Několik typů měnit také, např off_t stává off64_t. Je proto důležité, aby se vždy použít správné typy a nepoužívat např int namísto off_t. Pro přenositelnost s jinými platformami byste měli používat getconf LFS_CFLAGS která vrací -D_FILE_OFFSET_BITS = 64 na platformách Linux, ale může vrátit něco jiného na např Solaris. Pro propojení, měli byste použít na odkaz příznaky, které jsou hlášeny prostřednictvím getconf LFS_LDFLAGS. V systémech Linux, nepotřebujete speciální odkaz vlajky.
  • Definovat _LARGEFILE_SOURCE a _LARGEFILE64_SOURCE. S těmito definuje můžete použít funkce LFS jako open64 přímo.
  • Použijte příznak O_LARGEFILE otevřený pro provoz na velké soubory.
Odpovězeno 24/06/2009 v 00:04
zdroj uživatelem

hlasů
9

Chcete-li držet normy ISO C rozhraní, využití fgetpos()a fsetpos(). Nicméně, tyto funkce jsou vhodné pouze pro uložení pozici v souboru a jít zpět do stejné pozice později. Představují pozici pomocí typ fpos_t, který není potřebný pro být typ dat celé číslo. Například na systému rekordní bázi by to mohlo být struct obsahující rekordní počet a posun v záznamu. To může být příliš omezující.

POSIX definuje funkce ftello()a fseeko(), které představují polohu pomocí off_ttypu. Tento krok je nutný, aby být typu integer, a hodnota je byte posun od začátku souboru. Můžete provádět aritmetické na to, a můžete použít fseeko()k provedení relativní hledá. To bude pracovat na Linuxu a dalších POSIX systémech.

Navíc kompilovat -D_FILE_OFFSET_BITS=64(Linux / Solaris). To bude definovat off_tjako typ 64-bit (tj off64_t) namísto long, a bude nově definovat funkce, které používají offsety souborů, že jsou verze, které se 64-bitové posuny. Toto je výchozí při kompilaci 64-bit, takže není třeba v tomto případě.

Odpovězeno 24/06/2009 v 07:03
zdroj uživatelem

hlasů
5

fseek64() není standardní, měla by kompilátor dokument říct, kde ji hledat.

Už jste vyzkoušeli fgetposa fsetpos? Jsou určeny pro velké soubory a implementace typicky používá typ 64-bit jako základ pro fpos_t.

Odpovězeno 23/06/2009 v 23:51
zdroj uživatelem

hlasů
3

Už jste vyzkoušeli fseeko () s _FILE_OFFSET_BITS preprocesoru symbol nastavena na 64 let ?

To vám dá fseek () -jako rozhraní, ale s offset parametr typu off_t namísto dlouhý . Nastavení _FILE_OFFSET_BITS = 64 bude off_t typ 64-bit.

To samé platí pro platí pro ftello () .

Odpovězeno 24/06/2009 v 00:16
zdroj uživatelem

hlasů
2

Použijte fsetpos(3)a fgetpos(3). Oni používají fpos_tdatový typ, který věřím, že je zaručeno, že bude schopen držet alespoň 64 bitů.

Odpovězeno 24/06/2009 v 00:05
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more