2010-09-28 4 views
0

Comment écrire une fonction définie par l'utilisateur ANSI C qui renvoie une ligne spécifique d'un fichier texte?Comment écrire une fonction définie par l'utilisateur ANSI C qui renvoie une ligne spécifique d'un fichier texte?

char * ReadFromFile(const char * fileName, int line) 
{ 
    //.......... 
} 
+2

Cela ressemble à des devoirs ... –

+0

avez-vous accès à utiliser fopen fread et tel ? –

+1

Meilleure déclaration: 'int ReadFromFile (const char * nomFichier, int numéroLigne, char * tampon, int longueur_tampon)'. –

Répondre

3

Cela devrait faire l'affaire:

char * ReadFromFile(const char * fileName, int line) 
{ 

    FILE *fp; 

    char c; 
    char *buffer = malloc(100 * sizeof(char)); // change 100 to a suitable value; 
    int buffer_length = 100;      // eg. max length of line in your file 

    int num = 0; 

    if(line < 0) // check for negative line numbers 
    { 
    printf("Line number must be 0 or above\n"); 
    return(NULL); 
    } 

    if((fp = fopen(fileName,"r")) == NULL) 
    { 
    printf("File not found"); 
    return(NULL); 
    } 

    while(num < line) // line numbers start from 0 
    { 
    c = getc(fp); 
    if(c == '\n') 
    num++;  
    } 

    c = getc(fp); 

    if(c == EOF) 
    { 
    printf("Line not found\n"); 
    fclose(fp); 
    return(NULL); 
    } 
    else 
    { 
    ungetc(c,fp);  //push the read character back onto the stream 
    fgets(buffer,buffer_length,fp); 
    fclose(fp); 
    return(buffer); 
    } 

}

Edit: Les conditions aux limites proposées par caf & lorenzog dans les commentaires ont été inclus. Jamais pensé que l'anti-erreur pourrait être si fastidieux! (Ne vérifie toujours pas les cas où le numéro de ligne est plus que int peut contenir en toute sécurité. Ceci est laissé comme un exercice à OP :)

+0

@JMSA, d'accord, j'ai ajouté le tampon dans la fonction elle-même. –

+1

vous feriez mieux de vérifier cette ligne> 0 ou l'obtenir en tant que int non signé. Et supposons que la ligne n'est pas plus grande que la valeur maximale d'un int sur cette architecture. Mais je pense que ce que je signale n'a rien à voir avec l'ani C, donc je fais juste un commentaire ici. – lorenzog

+1

Peut-être une vérification pour EOF? – caf

Questions connexes