2009-11-14 4 views
0

J'utilise ce code pour lire un fichier dans un tampon. Le fichier est plein de structs de type evaluacion (y compris certaines variables char et int). Maintenant, j'ai le fichier entier dans un tampon, comment puis-je trouver les valeurs d'une variable dans le tampon maintenant? Par exemple buf.notamedia < 4. Ils sont supposés être nombreux dans le fichier.Gestion des données dans un tampon

#include <unistd.h> 
#include <sys/stat.h> 
int revisanotas(int fd) 
{ 
    int nbytes = 1; 
    int nbytese = 0; 
    evaluacion buf; 
    struct stat datos; 
    fstat(fd, &datos); 

    printf("Size of file = %d \n", datos.st_size); 
    char *buffer = (char *)malloc(datos.st_size); 
    int actual = read(fd, buffer, datos.st_size); 

    printf("actual = %d\n", actual); 

    if (buf.notamedia >= 4.5 && buf.notamedia < 5) 
    { 
     /* ... */ 
    } 
} 

Toute idée est la bienvenue


que je fais comme vous le dites, mais je n'obtenir une itération, je ne sais pas ce que je fais mal :(

evaluacion* buffer=(evaluacion*)malloc(datos.st_size); 
int actual = read(fd,buffer,datos.st_size); 

printf("Number of structs = %d", (datos.st_size/(sizeof(evaluacion)))); 

for (i=0;i<(datos.st_size/(sizeof(evaluacion)));i++); 
{ 
printf("Notamedia = %f\n",buffer[i].notamedia); 
if (buffer[i].notamedia >= 4.5 && buffer[i].notamedia < 5) 
{ 
printf("Notamedia = %f\n",buffer[i].notamedia); 
} 
{ 
} 
} 
} 
+0

N'oubliez pas de mettre votre lecture dans une boucle pour lire le fichier entier. En outre, il peut être plus facile de simplement mmap() le fichier. – Suppressingfire

+0

@Suppressingfire: il fait une seule lecture pour obtenir le fichier entier, à partir du moment où la fonction fstat() est exécutée, de toute façon. –

Répondre

5

pour définir le Easiest tampon comme un pointeur vers la structure de données et l'utiliser pour déréférencer les données (même si vous devez vous assurer de la taille de fichier est un multiple de la taille de la structure).

à savoir

evaluacion* buffer = (evaluation*)malloc(datos.st_size); 
if(buffer[0].notamedia >= 4.5)

Vous pouvez alors augmenter l'index pour accéder à d'autres structures chargés.

+0

Merci tyranide pour la réponse. Dans ce cas, devrais-je lire une struct par une, et lire le fichier chaque fois que je recherche la variable? Ce que je dois faire est de lire le fichier une seule fois, faire les opérations avec les structures en mémoire, puis réécrire le fichier sur le disque une seule fois. – Peter

+1

Si le tampon contient les évaluations l'une après l'autre, alors vous pouvez simplement regarder buffer [1] pour le 2ème, buffer [2] pour le 3ème ... Assurez-vous juste de diviser st_size par sizeof (evaluacion) pour faire Assurez-vous de ne pas dépasser la fin du fichier (c'est-à-dire, ne laissez pas votre index tampon supérieur à st_size/sizeof (evaluacion).) – Suppressingfire

1

Merci pour les commentaires, je pense que je résolu le problème, je modifié le code:

#include <unistd.h> 
#include <sys/stat.h> 
int revisanotas(int fd) 
{ 
int nbytes=1; 
int nbytese=0; 
int i=0; 
int n=0; 
struct stat datos; 
fstat(fd, &datos); 
evaluacion buf; 
printf("File size = %d \n", datos.st_size); 
evaluacion* buffer=(evaluacion*)malloc(datos.st_size); 
int actual = read(fd,buffer,datos.st_size); 

do 
{ 
i++; 
if (buffer[i].notamedia >= 4.5 && buffer[i].notamedia < 5) 
{ 
n=n+1; 
/*printf("Notamedia = %f\n",buffer[i].notamedia); 
*/ 
buffer[i].notamedia=5; 
} 

}while (i<(datos.st_size/(sizeof(evaluacion)))); 
nbytese=write(fd,buffer,datos.st_size); 
printf("Written bytes = %d\n",nbytese); 
return(n); 
} 

Maintenant, si la condition est trouvée, je modifier le tampon. Une fois que j'ai lu toutes les structures, j'écris à nouveau le fichier sur le disque, mais j'ai toujours un problème, à chaque fois, au lieu d'écrire le fichier dans la même position, il semble que j'ajoute la même information après l'ancienne. si je lis le fichier une fois que je reçois 3,5 Mo, deux fois 7 Mo et ainsi de suite: S. Une idée que puis-je faire? Merci

+0

Je pense que je l'ai résolu avec lseek, en plaçant le pointeur au début avant l'écriture. lseek (fd, OL, SEEK_SET); :) – Peter

Questions connexes