2010-06-14 5 views
1

Je suis totalement nouveau en C, et j'essaie de faire une petite application qui cherche une chaîne dans un fichier. Mon problème est que j'ai besoin d'ouvrir un gros fichier (plus de 1 Go) avec juste une ligne à l'intérieur et que fgets me renvoie le fichier entier (je fais un test avec un fichier de 10 Ko).fgets dans C ne retourne pas une partie d'une chaîne

En fait, ceci est mon code:

#include <stdio.h> 
#include <string.h> 


int main(int argc, char *argv[]) { 
char *search = argv[argc-1]; 

int retro = strlen(search); 
int pun = 0; 
int sortida; 
int limit = 10; 

char ara[20]; 

FILE *fp; 
if ((fp = fopen ("SEARCHFILE", "r")) == NULL){ 
    sortida = -1; 
    exit (1); 
} 

while(!feof(fp)){ 
    if (fgets(ara, 20, fp) == NULL){ 
    break; 
    } 
    //this must be a 20 bytes line, but it gets the entyre 10Kb file 
    printf("%s",ara); 
} 

    sortida = 1; 

if(fclose(fp) != 0){ 
    sortida = -2; 
    exit (1); 
} 

return 0; 
} 

Que puis-je faire pour trouver une chaîne dans un fichier?

J'ai essayé avec GREP mais cela n'aide pas, car il renvoie la position: ENTIRE_STRING.

Je suis ouvert aux idées.

+0

Que voulez-vous dire exactement par votre commentaire, _ce doit être une ligne de 20 octets, mais il obtient le fichier entier 10KB_? Voulez-vous dire que les 10 Ko entiers sont imprimés sur une ligne? (Comment pouvez-vous dire la différence si les 10 Ko entiers sont sortis en une fois ou si les morceaux 20B sont sortis un à la fois, si vous n'incluez pas de caractère séparateur après chaque opération d'impression? Il est impossible de faire la différence. réponse semblerait raisonnable.) – stakx

+1

feof + fgets n'est pas bon. voir http://c-faq.com/stdio/feof.html. – Nyan

+0

@stakx, c'est pour le \ n manquez. Au moment c'est OK :). Merci pour votre attention. – Marc

Répondre

3

Essayez

printf("%s\n",ara);  

Voir également initialisation des variables avant de les utiliser:

char ara[20]={0x0}; 
+1

Je n'ai aucune idée de comment 'printf' résoudrait son problème, et il n'y a pas besoin d'initialiser' ara' ici, car 'fgets' va l'écraser –

+0

% s \ n rend la chaîne d'impression comme une nouvelle ligne à chaque fois \ n == caractère de nouvelle ligne –

+0

Oh, je vois, vous disiez d'ajouter le '\ n' à la fin de son printf existant. Got it –

1

Vous n'alloué 20 octets pour le tampon d'entrée, mais a dit aux fgets de lire 20 octets.

Faire ce changement:

if (fgets(ara, sizeof(ara)-1, fp) == NULL){ 

rappelez-vous, si vous voulez 20 caractères PLUS la fuite « \ 0 » qui marque la fin de la chaîne que vous devez allouer 21 octets.

Questions connexes