Trovare riga in un file che inizia in un certo modo

di il
1 risposte

Trovare riga in un file che inizia in un certo modo

Salve a tutti,
ho un file di testo ad esempio:
  • processor : 0
    vendor_id : GenuineIntel
    cpu family : 6
    model : 5
    model name : Pentium II (Deschutes)
    stepping : 2
    cpu MHz : 400.913520
    cache size : 512 KB
    fdiv_bug : no
    hlt_bug : no
devo scrivere un programma in C che analizza il File e trova la riga i cui primi x caratteri sono "model name" (ad esempio). successivamente devo estrarre da questa riga il valore associato allo specifico campo (Pentium II (Deschutes) ). Questo è il codice che ho scritto:

int get_cpu(char* info)
{
    FILE *fp; 
    char buffer[1024]; 
    size_t bytes_read; 
    char *match; 

    /* Read the entire contents of /proc/cpuinfo into the buffer.  */ 
    fp = fopen("/proc/cpuinfo", "r"); 

    bytes_read = fread(buffer, 1, sizeof (buffer), fp); 

    fclose (fp); 

    /* Bail if read failed or if buffer isn't big enough.  */ 
    if (bytes_read == 0 || bytes_read == sizeof (buffer)) 
        return 0; 

    /* NUL-terminate the text.  */ 
    buffer[bytes_read] == '\0'; 

    /* Locate the line that starts with "model name".  */ 
    match = strstr(buffer, "model name"); 

    if (match == NULL) 
        return 0; 

    /* copy the line */
    strcpy(info, match);
}
Il problema è che il buffer risulta sempre troppo piccolo......

1 Risposte

  • Re: Trovare riga in un file che inizia in un certo modo

    Il frammento di codice legge d'un colpo 1024 Byte, poi cerca l'occorrenza che ti interessa e copia dal punto che fa match fino alla fine in info.

    Per seguire il tuo esempio se hai il file seguente:

    processor : 0
    vendor_id : GenuineIntel
    cpu family : 6
    model : 5
    model name : Pentium II (Deschutes)
    stepping : 2
    cpu MHz : 400.913520
    cache size : 512 KB
    fdiv_bug : no
    hlt_bug : no

    in buffer avrai un'unica stringa:
    processor : 0\nvendor_id : GenuineIntel\ncpu family : 6\nmodel : 5\nmodel name : \nPentium II (Deschutes)\nstepping : 2\ncpu MHz : 400.913520\ncache size : 512 KB\nfdiv_bug : no\nhlt_bug : no\n

    quando farai match ti ritrovi in info un'unica stringa:
    model name : \nPentium II (Deschutes)\nstepping : 2\ncpu MHz : 400.913520\ncache size : 512 KB\nfdiv_bug : no\nhlt_bug : no\n

    Adesso mi chiedo è necessario utilizzare fread? Con fgets sarebbe tutto più semplice, se invece è necessario la fread devi modificare il codice affinché ti legga quello che ti serve.

    P.s.
    Forse intendi scrivere:
    buffer[bytes_read] = '\0';
Devi accedere o registrarti per scrivere nel forum
1 risposte