Perfetto!
utilizzero' un metodo standard C e tutto quello che scrivero' di seguito e' sempre da verificare.
Abbiamo bisogno di sapere quanti sudoku contiene il file.
(In questo caso ogni sudoku corrisponde ad un record).
Ogni riga contiene un record + un invio, siccome ogni record e' composto da 81 caratteri, ogni riga ha la dimensione di 82 caratteri, ossia 82 bytes.
La dimensione del file in bytes diviso 82 ci restituisce il numero dei record.
Dichiarazione varibili e costanti:
- Codice:
/* costanti */
#define nCol 9 // numero di colonne di un sudoku
#define nRow 9 // numero di righe di un sudoku
#define rowSize 82 // dimensione di una riga
/* struttura del sudoku */
/* matrice 9*9 */
typedef struct {
char value[nCol][nRow];
} sudokuType;
/* variabili */
sudokuType sudoku; // variabile sudoku;
int sudokuValue[nCol][nRow]; valori numerici del sudoku che dovrai utilizzare successivamente
FILE *fp; // puntatore al file
long fileSize; // dimensione del file
long numRec; // numero dei record ovvero dei sudoku
long index; // indice del sudoku da leggere
ricaviamo il numero dei record:
- Codice:
fp = fopen.... // esegui sempre il controllo dell'esistenza del file
fseek(fp, 0, SEEK_END); // si punta alla fine del file
fileSize = ftell(fp) + 1; // Un file e' grande quanto la sua posizione finale + 1
numRec = fileSize / rowSize;
fclose (fp);
generiamo il numero casuale del sudoku da leggere:
- Codice:
// ...non dimenticare il randomize nel main ....
index = rand() % numRec // restituisce un valore da 0 a numRec - 1
peschiamo il sudoku dal file:
- Codice:
fp = fopen.... // come prima esegui sempre il controllo dell'esistenza del file
fseek(fp, index * rowSize, SEEK_SET); // puntera' all'inizio del sudoku che vogliamo leggere
fread(fp, sizeof(sudokyType), 1, sudoku);
fclose(fp);
convertiamo i caratteri in numeri:
- Codice:
// scansione valore per valore
for(c = 0; c < nCol; c++)
for(r = 0; r < nRow; r++)
if(sudoku.value[c][r] == '-')
sudokuValue[c][r] = 0;
else
sudokuValue[c][r] = sudoku.value[c][r] - 48;
credo che hai tutto per proseguire.
Se ti occorre un ulteriore aiuto anche su come rappresentare un sudoku oppure qualche chiarimento chiedi pure.
A presto,
Eugenio