Linux C / C ++ para leer y escribir archivos de gran tamaño a más de 2G Notas

fondo

archivo grande en la escritura incrementales del proyecto, se encontró con un problema:

fopen : Value too large for defined data type.

De acuerdo con esta solicitud de acceso a la información relevante se muestra:

  • Toolchain demasiado viejo: Hass cadena de herramientas que actualmente no puedo encontrar un método de sustitución
  • sistema de archivos inde es de 64 bits: Ver el cat /proc/fs/{文件系统类型}/{设备名}/optionsencontró todo normal,

Se ha cambiado el pensamiento y la mirada directa de acuerdo con las necesidades: Linux C leer y escribir archivos de gran tamaño.

Para información aprendida

entorno Linux por defecto, leer y escribir más de presentar declaraciones 2G un error.

Se define como macros pueden romper este límite, válido tanto para lectura / escritura y fread / fwrite.

Tenga en cuenta que se debe definir antes de que todos los archivos de cabecera.

#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#define _FILE_OFFSET_BITS 64

fseek tema del acceso al tamaño de archivo más grande que 4G
reproducida Feng ciruela Último mensaje el 23/06/2015 23:30:50 lectura número 3154 colección
lanzada

Recientemente encontrado con problemas para obtener el tamaño del archivo, ya que en todas partes para encontrar el problema, y ​​finalmente me di cuenta de que hay un problema a la hora de obtener el tamaño del archivo. Más cerca de casa:

tamaño de archivo previamente adquirido es el momento para hacerlo:

fseek (fp, 0, SEEK_END);

_length = ftell (fp);

fseek (fp, 0, SEEK_SET);

En circunstancias normales, como esto no es problema, pero parece que cuando la lectura es superior a 3,4 g leído mal la situación, ya sea -1, ya sea _length tipos de datos máximos, en definitiva, es equivocado.

La solución es:

pos fpos_t;
fseek (fp, 0, SEEK_END);
fgetpos (chimenea, y pos);
fseek (fp, 0, SEEK_SET);

pos es el tamaño del archivo, y fpos_t especialmente marcada, este tipo de datos se define en el interior archivo stdio.h

        typedef __int64 fpos_t;

Es un sentido tal, como esto no añadiría ninguna librería adicional, o alguna voz en lo API o ventanas pueden ser resueltos!

basado en Mmap leer y escribir archivos de gran tamaño

Supongo que te gusta

Origin www.cnblogs.com/schips/p/12456653.html
Recomendado
Clasificación