2009-12-28 4 views
1

Je lis un fichier en C, char par char mais j'ai besoin de 2 caractères consécutifs. S'il vous plaît, quelqu'un peut-il me suggérer des options?Comment puis-je obtenir deux caractères consécutifs d'un flux?

l'idée principale du programme est de lire un fichier source C et de trouver le nombre de tous les caractères significatifs (ignorer ws) et d'ignorer '* /' & '/ *'. J'essaye d'écrire le programme au niveau vraiment basique parce que c'est pour le travail de cours pour mon ami. En général, je suis programmeur PHP.

Ceci est le code complet que j'ai réussi à écrire.

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

int in_array(char *array, char searchedEl); 
int main(){ 
    FILE *fp; 
    char readChar; 
    char exeptChars[] = {'\n', '\t','\0'}; 
    int charsCounter = 0; 
    char *openComment = "/*"; 
char *closeComment = "*/"; 
char tempHolder[2]; 
int j=0; 
    fp=fopen("testrw.txt","r"); 
    if(!fp){ 
    printf("Could not open file\n"); 
    return 1; 
    } 
    while((readChar = fgetc(fp)) != EOF){ 
    if((readChar == '*') || (readChar == '/') || (readChar == '\\')){ 
     if(j < 1){ 
    tempHolder[j] = readChar; 
    j++; 
    continue; 
     } 
     else{ 
    tempHolder[j] = readChar; 
    if(strcmp(tempHolder, openComment) || strcmp(tempHolder, closeComment)){ 
     charsCounter += 2; 
    } 
    tempHolder[2]='\0'; 
    j=0; 
    continue; 
     } 
    } 

    if(!in_array(exeptChars, readChar)){ 
     printf("Permited char: %c\n", readChar); 
     charsCounter++; 
    } 
    } 
    printf("Characters %d\n", charsCounter+1); 
    return 0; 
} 
int in_array(char *array, char searchedEl){ 
    char tempEl; 
    int i=0; 
    while(tempEl = array[i]){ 
    if(tempEl == searchedEl){ 
     return 1; 
    } 
    i++; 
    } 
    return 0; 
} 
+2

Appelez fgetc() pour obtenir le premier caractère, puis rappelez-le pour obtenir le caractère suivant. Ou est-ce trop évident? –

+0

Pouvez-vous s'il vous plaît poster votre programme entier? Dites-moi aussi la logique de haut niveau. On dirait que vous essayez de faire quelque chose avec des commentaires multilignes/* et */ – Madhu

+0

l'idée principale du programme est de lire un fichier C source et de trouver le nombre de tous les caractères significatifs (ignorer ws) et d'ignorer '* /' & '/ *'. J'essaye d'écrire le programme au niveau vraiment basique parce que c'est pour le travail de cours pour mon ami. En général, je suis programmeur PHP. – bozhidarc

Répondre

1

fread() va vous permettra de récupérer plusieurs octets en une seule opération.

0

Prenez le else {} de l'if() (et, bien sûr, le convertir en si (j == 1))

0

utilisation

size_t fread (void * ptr, size_t size, size_t count, FILE * stream); 

PTR - pointeur sur un bloc de mémoire avec une taille minimale de (taille * nombre) octets. size - Taille en octets de chaque élément à lire. count - Nombre d'éléments, chacun d'une taille de taille octets. stream - Pointeur vers un objet FILE qui spécifie un flux d'entrée. size_t - Le nombre total d'éléments lus avec succès.

1

Utilisez ungetc (readChar, fp) si le caractère suivant est erroné:

char get_token(){ 
    readChar = fgetc(fp); 
    if(readChar==EOF) return END_OF_FILE; 
    if(readChar=='/'){ 
     nextChar=fgetc(fp); 
     if(nextChar==EOF) return readChar; 
     if(nextChar=='*') return OPEN_COMMENT; 
     ungetc(nextChar,fp); 
    } 
} 
+0

Je vais ramasser ça :) – bozhidarc

0

Il semble que vous réinventer la roue. L'analyse du texte char-by-char est quelque chose que vous ne devriez pas faire à moins de faire quelque chose de très bas niveau.

je pense qu'il est préférable d'utiliser des libs d'analyse de texte (GNU regex?)

D'après ce que je comprends est que vous êtes à la recherche des commentaires dans le code C. Si vous voulez analyser le code C, il y a many ways pour le faire mieux que de l'analyser par l'analyse de char-char.

Questions connexes