2009-12-29 4 views
0

J'essaie de combiner des mots issus de caractères que je lis dans un fichier. Le problème est dans la combinaison des caractères. La façon dont je le fais est la suivante:Comment remplir dynamiquement un tableau à partir d'un flux de fichier C

char *charArr 
while((readChar = fgetc(fp)) != EOF){ 
charArr[i] = readChar; 
i++; 
} 
+0

Dupliquer (je pense) de cette question http://stackoverflow.com/questions/1969242/c-question-how-to-get-two-consecutive-chars-from-a-stream posté hier par le même utilisateur. –

+0

en dehors du fait que «je» n'est jamais incrémenté, et cela est très enclin à buffer overflows, ce qui ne va pas avec ce que vous faites? – James

+0

J'ai oublié de l'ajouter. Ce que j'essaie de faire est de diviser un fichier en mots et après cela de filtrer ces mots – bozhidarc

Répondre

2

Tout d'abord, vous devez allouer de la mémoire pour votre tampon charArr; comme il est écrit, charArr ne pointe pas initialement nulle part significative:

char *charArr = malloc(SOME_INITIAL_SIZE); 

où SOME_INITIAL_SIZE est assez grand pour gérer la plupart des cas. Pour les moments où ce n'est pas assez grand, vous devrez étendre le tampon en utilisant realloc(). Cela signifie que vous devez également garder une trace de la taille actuelle du tampon:

size_t currentSize = 0; 
size_t i = 0; 
char *charArr = malloc(SOME_INITIAL_SIZE); 
if (!charArr) 
{ 
    /** 
    * memory allocation failed: for this example we treat it as a fatal 
    * error and bail completely 
    */ 
    exit(0); 
} 

currentSize = SOME_INITIAL_SIZE; 
while ((readchar = fgetc(fp)) != EOF) 
{ 
    /** 
    * Have we filled up the buffer? 
    */ 
    if (i == currentSize) 
    { 
    /** 
    * Yes. Double the size of the buffer. 
    */ 
    char *tmp = realloc(charArr, currentSize * 2); 
    if (tmp) 
    { 
     charArr = tmp; 
     currentSize *= 2; 
    } 
    else 
    { 
     /** 
     * The realloc call failed; again, we treat this as a fatal error. 
     * Deallocate what memory we have already allocated and exit 
     */ 
     free(charArr); 
     exit(0); 
    } 
    } 
    charArr[i++] = readchar; 
} 

Ne pas oublier d'ajouter une terminaison 0 si vous traitez le tableau comme une chaîne.

EDIT

Cependant, la grande question est pourquoi vous pensez que vous devez lire en mémoire le contenu de l'ensemble du fichier avant de filtrer les données? Pourquoi ne pas filtrer au fur et à mesure?

+0

Ceci est hors du point principal, mais vous devez quitter avec EXIT_FAILURE ou un autre code de retour * non-nul * pour ces cas de défaillance. –

+0

L'idée principale du programme que je veux écrire est de lire un fichier C et de compter chaque lettre dans tous les identifiants qu'il contient. J'ai donc fait deux tableaux, un avec tous les opérateurs (j'ai appelé les terminateurs de mots) et ws et etc., et un avec tous les mots-clés C. Mon idée était de lire le fichier char par char (que je mets en tableau) jusqu'à ce que l'un des terminateurs de mots se produise. Quand cela arrive, je compare le mot dans le tableau avec les mots-clés, et si ce n'est pas un mot-clé, je comprends que les caractères comptent. – bozhidarc

Questions connexes