fseek() em arquivos > 2GB [RESOLVIDO]

1. fseek() em arquivos > 2GB [RESOLVIDO]

Gabriel Duarte Guimarães Costa
gabrield

(usa Debian)

Enviado em 16/12/2008 - 14:50h

Oi galera, fiz um pequeno programa para criar "sparse files". Ele funciona muito bem quando trabalho com arquivos de até 2GB, após isso, ele não consegue gravar e fica por isso mesmo. Ele usa fseek() para poder percorrer o arquivo. Andei dando uma pesquisada por ai e vi que precisava usar fseeko64() para poder percorrer arquivos maiores que 2GB, mas infelizmente não consegui fazer funcionar. Abaixo vai o código para que possam analizar e ver se conseguem fazer funcionar!

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[]){

FILE *dsk;
char zero = '0';
int size;
if (argc < 3) {
printf("Usage: %s [FILE] [SIZE]\n", argv[0]);
printf("Example:\n\t%s harddisk 10\t [create a file called \"harddisk\" with 10MB]\n", argv[0]);
return 1;
}

size = atoi(argv[2]);
dsk = fopen(argv[1], "wb+");
fseek(dsk, size*1024*1024, SEEK_SET);
fwrite(&zero, 1, sizeof(char), dsk);
fclose(dsk);
printf("Wrote: %s...\n", argv[1]);
printf("virtual size: %dMB (%d bytes)\n", size, (size*1024*1024));

return 0;
}


  


2. MELHOR RESPOSTA

Marcelo A. B. Slomp
mslomp

(usa Slackware)

Enviado em 16/12/2008 - 18:15h

fseeko64 precisa que o argumento que define a posição seja um int64 (aka long long int).
além disso, o arquivo também deve ser aberto no modo 64-bit, através de fopen64.
para a posição, você pode utilizar o wrapper int64_t ou ainda long long.

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h> /* caso use int64_t, inclua essa header */

int main(int argc, char *argv[]){

FILE *dsk;
char zero = '0';
int64_t size; /* int64_t ao invés de int */
if (argc < 3) {
printf("Usage: %s [FILE] [SIZE]\n", argv[0]);
printf("Example:\n\t%s harddisk 10\t [create a file called \"harddisk\" with 10MB]\n", argv[0]);
return 1;
}

size = (int64_t)atoi(argv[2]);
dsk = fopen64(argv[1], "wb+"); /* note que aqui usamos fopen64 */
fseeko64(dsk, size*1024*1024, SEEK_SET); /* agora sim, a posição é um int64 */
fwrite(&zero, 1, sizeof(char), dsk);
fclose(dsk);
printf("Wrote: %s...\n", argv[1]);
printf("virtual size: %dMB (%lld bytes)\n", size, (size*1024*1024));

return 0;
}





Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts