[C] Spiegazione funzione fscanf..

Bazzaz
Salve,probabilmente è una cosa stupida ma stavo dando un'occhiata a qualche esercizio su matrici e file, e andando a fare qualche esercizio non sono riuscito a capire bene il funzionamento della funzione fscanf (o meglio di cosa succede dentro il file quando la usi) così ho cercato in giro qualche esercizio e ho trovato questo:
L'esercizio chiedeva di aprire un file contenente dei valori da inserire dentro una matrice che andava allocata da un altra funzione i primi due numeri nel file di testo andavano ad indicare il numero di righe (il primo) ed il numero di colonne il secondo

float** read(const char *filename) {
  FILE *fp = fopen(filename, "r");
  if(fp == NULL) {
    printf("Can't open file %s...!\n", filename);
    fclose(fp);
    return NULL;
  }

  int rows = 0;
  fscanf(fp, "%d", &rows);
  if(fscanf(fp, "%d", &rows) != 1) {
    printf("Error while reading file %s\n", filename);
    fclose(fp);
    return NULL;
  }
  if(rows == 0) {
    return NULL;
  }

  int cols = 0; 
  if(fscanf(fp, "%d", &cols) != 1) {
    printf("Error while reading file %s\n", filename);
    fclose(fp);
    return NULL;
  }
  if(cols == 0) {
    return NULL;
  }
  
  float**m = alloc(rows, cols);
  for(int r = 0; r < rows; ++r) {
    for(int c = 0; c < cols; ++c) {
      float value= 0.0f;
      if(fscanf(fp, "%f", &value) != 1) {
        printf("Error while reading file %s\n", filename);
        fclose(fp);
        return NULL;
      }
      m[r][c] = value;
    }
  }
  fclose(fp);
  return m;
}


supponiamo che il file di testo contenga questi valori
3 2
4.0 7.8
8.9 4.5
-6.3 3.1

3 sono le righe e 2 le colonne

La cosa che non capisco è questa:
Qui invoco la funzione fscanf per prendermi il primo valore e me lo vado a mettere dentro "rows" quindi rows sarà = 3
 int rows = 0;
  fscanf(fp, "%d", &rows);
  if(fscanf(fp, "%d", &rows) != 1) {
    printf("Error while reading file %s\n", filename);
    fclose(fp);
    return NULL;
  }
 


però quando poi vado a fare la stessa cosa per prendermi il valore delle colonne come fa la funzione a sapere che ho già letto il primo valore e quindi va a prendersi il "2" invece che il 3 è perchè tiene conto del valore letto prima cè è come se "tenesse il segno di ciò che ho letto fino ad ora" e quindi invece di ricominciare dall'inizio del file continua da dove mi sono fermato?
int cols = 0; 
  if(fscanf(fp, "%d", &cols) != 1) {
    printf("Error while reading file %s\n", filename);
    fclose(fp);
    return NULL;
  }



così ho provato a riscrivere come:
int rows, cols;
fscanf(fp, "%d%d" &rows,&cols);

e mi sembra più chiaro perchè così so che vado a leggere 2 interi uno dopo l'altro quindi so per certo che dentro rows ci andrà 3 e dentro cols 2

(stesso dubbio per ciò che accade nel for)

Risposte
apatriarca
La struttura FILE contiene all'interno un "puntatore" alla posizione corrente nel file. Questa posizione nel file viene modificata da praticamente tutte le funzioni di lettura e scrittura. Ogni volta che leggi con scanf ti stai quindi spostando più avanti nel file in modo che alla prossima lettura leggerai dei nuovi valori. Puoi usare le funzioni ftell e fseek per ottenere e modificare questa posizione.

Bazzaz
"apatriarca":
La struttura FILE contiene all'interno un "puntatore" alla posizione corrente nel file. Questa posizione nel file viene modificata da praticamente tutte le funzioni di lettura e scrittura. Ogni volta che leggi con scanf ti stai quindi spostando più avanti nel file in modo che alla prossima lettura leggerai dei nuovi valori. Puoi usare le funzioni ftell e fseek per ottenere e modificare questa posizione.


ohh ok allora avevo capito bene nelle dispense che avevo trovato spiegavano solamente che fscanf leggeva in base al formato che tu gli davi tipo se avessi scritto "%d %c %f" mi avrebbe letto un intero un carattere e un float mentre e si riferiva allo stream del file probabilmente intendeva proprio questo puntatore alla posizione corrente, grazie mille :smt023

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.