2015-04-27 18 views
6

Ho iniziato a imparare C (tramite Youtube e K & R) qualche tempo fa e sto cercando di scrivere alcuni programmi come pratica. Attualmente voglio creare un programma che legge le parole da un file e ne confronta l'inizio con l'input dell'utente. Il programma confronta con successo la prima parola e mi dà un risultato, ma non riesco a ottenere il fseek() per spostarsi correttamente alla riga successiva! (Questa è la versione corrente della parte che cerca di parole.)Problemi con fseek() e lettura dal file

fp= fopen("final.txt", "r"); 
for (i=0; i<8; i++){ 

    fseek(fp, fileCount, SEEK_CUR); 

    fgets(strFile, 20, fp); 

    fileCount= strlen(strFile); 

    printf("Strlen %d. is: %d\n", i+1, fileCount); 
    printf("String is %s", strFile); 

    compareStr(strUser, strFile); 
}; 

fclose(fp); 

FileCount è impostato su 0 e strlen() dovrebbe restituire la lunghezza della srtFile stringa, ma doesn' abbastanza bene. Ho anche provato a impostare fseek() manualmente, ma non si muoveva. Le parole del mio file sono: Primo, Ultimo, Indice, Campo, ID, Numero, Fuoco, Film. (ognuno è in una nuova riga). Quando eseguo il programma e digitare F (per la ricerca di una parola che ha un capitale f), l'output è:

Type in the letters: F 
Strlen 1. is: 6 
String is First 
Match found: First 

Strlen 2. is: 6 
String is Index 
Strlen 3. is: 1 
String is 
Strlen 4. is: 2 
String is D 
Strlen 5. is: 5 
String is mber 
Strlen 6. is: 1 
String is 
Strlen 7. is: 3 
String is ilmStrlen 8. is: 3 
String is ilm 
Process returned 0 (0x0) execution time : 2.218 s 
Press any key to continue. 

sono disperata. Qualche idea/indizio?

[EDIT] Un grande ringraziamento a tutti coloro che mi hanno aiutato con questo!

+3

Non vuoi aumentare 'fileCount'? Se sei in Windows, potresti voler aprire con "rb" a causa della convenzione CRLF. Se stai leggendo il file in sequenza, perché preoccuparti di 'fseek'? –

+1

Il tuo filepointer è già alla parola successiva, fgets sposta il puntatore del file mentre legge, quindi il fseek è superfluo. – rhubarbdog

+1

BTW 'fseek' potrebbe essere pericoloso per i file aperti in modalità testo; spiegato [qui] (http://arstechnica.com/civis/viewtopic.php?t=420490). Riepilogo: a causa della conversione '\ n' <->' \ r \ n', il parametro di 'fseek' dovrebbe essere 0 o provenire da una precedente chiamata' ftell'. Quindi dovresti usare sia 'fseek' che' ftell' nel tuo programma (o nessuno? Forse non hai bisogno di 'fseek' affatto?). – anatolyg

risposta

3

Il problema qui appare a causa del parametro SEEK_CUR fseek.

Si sta spostando il cursore due volte.

Uno spostamento di viene eseguito da fgets (legge e sposta il cursore in avanti). E lo spostamento secondo viene eseguito manualmente da fseek.

Una soluzione può essere quella di rimuovere completamente la chiamata fseek.

Un'altra soluzione è utilizzare SEEK_SET anziché SEEK_CUR, ma con un contatore che contiene il numero totale di caratteri letti (incluso il carattere della nuova riga). Per far funzionare questa soluzione è necessario cambiare anche

fileCount = strlen (strFile);

a

FileCount + = strlen (strFile) + 1;

SEEK_SET sposta il cursore dall'inizio del file.

SEEK_CUR sposta il cursore dalla posizione corrente.

+0

Grazie mille! Non ho trovato da nessuna parte che fgets sposta il cursore, altrimenti non avrei messo quel fseek(). Metto fseek() fuori dal ciclo for e funziona! –

2

Il problema è che non si sta utilizzando fseek() correttamente.

Nel codice,

fseek(fp, fileCount, SEEK_CUR); 

imposta il puntatore al punto in cui la sua attuale al più il FileCount (l'offset). Ecco perché è saltato Last e legge Index come stringa 2.

Per risolvere questo problema, rimuovere semplicemente la dichiarazione fseek().