Aiuto con l'apertura di un file

di Anonimizzato7318 il
9 risposte
Sto cercando di creare un programmino che legga i numeri scritti in un file *.txt poi li visualizzi sullo schermo, il file è nella stessa directory del codice e del programma ma quando lo faccio partire ottengo questo errore:
Last login: Wed May 26 18:46:47 on console
/Users/filopelor92/Documents/apri\ documento/build/Debug/apri\ documento ; exit;
macbook-di-filippo-savi:~ filopelor92$ /Users/filopelor92/Documents/apri\ documento/build/Debug/apri\ documento ; exit;
File coudn't be opened,Program will exitThe numbers are:
logout
ed il codice sorgente è:
#include <stdio.h>
#include <stdlib.h>

int main() {
FILE *file;
int numbers[3000];
int i=0,j;

file = fopen("numeri.dat", "r+");

if (file != NULL) {

printf("File opened successfully.\n");

}

else {

printf("File coudn't be opened,Program will exit");


}

while(i>0) {
fscanf(file, "%d", &numbers);
i++;
}

printf("The numbers are:\n");

for(j=0 ; j<i ; j++) {
printf("%d\n", numbers[j]);
}

fclose(file);
return 0;
}


vi prego aiutatemi

9 Risposte

  • Hai provato con:
    
    file = fopen("./numeri.dat", "r+");
    
    ?
  • Ho cambiato il codice in:
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
    	FILE *file;
    	int numbers[3000]; 
    	int i=0,j;
    	
    	[color=#40FF00]file = fopen("/Users/filopelor92/Documents/apri documento/numeri.txt", "r");[/color]
    	if (file != NULL) {
    		
    		               printf("File opened successfully.\n");
    		
    	                  }
    	
     				 else {
    					 
    					   printf("File coudn't be opened,Program will exit");
    					    
    					 
    					  }
    	
    	while(i>0) { 
    		fscanf(file, "%d", &numbers[i]);
    		i++;
    	}
    	
    	printf("The numbers are:\n");
    	
    	for(j=0 ; j<i ; j++) {
    		printf("%d\n", numbers[j]);
    	}
    	 
           fclose(file);
    
    	[color=#40FF00]if ( file == NULL ) {
    		printf("file chiuso con successo");
    	                     }[/color]
             fclose(file);
    	return 0;
    }
    in primo luogo ho specificato il percorso completo del file poi ho cambiato il modo di apertura in lettura semplice dato che a me serve solo quello poi ho aggiunto la seconda stringa di codice per sapere si il file fosse chiuso correttamente. cio che ho ricevuto come output è stato questo:
    Last login: Wed May 26 20:10:42 on ttys001
    /Users/filopelor92/Documents/apri\ documento/build/Debug/apri\ documento ; exit;
    macbook-di-filippo-savi:~ filopelor92$ /Users/filopelor92/Documents/apri\ documento/build/Debug/apri\ documento ; exit;
    File opened successfully.
    The numbers are:
    logout
  • Quindi adesso il file riesci ad aprirlo. (Probabilmente bastava solo il ./ davanti al nome per farlo).

    Stai attento al while: la condizione è sempre falsa e non leggerà mai da file. Però se fosse vera andresti in loop infinito visto che continui a incrementare i e verificare che sia sempre > 0. Inoltre non verifichi mai se hai raggiunto la fine del file.
    
    while (!feof(file) && i < 3000) {
        fscanf(file, "%d", &numbers[i]);
    }
    
    Edit:
    fclose() non setta a NULL la variabile file, ma restituisce 0 se chiude il file o EOF se fallisce. Quindi devi modificare anche quell'if.
  • Ok ora che il codice è così (ho aggiunto un i++; nel ciclo while)
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
    	FILE *file;
    	int numbers[3000]; 
    	int i=0,j;
    	
    	file = fopen("/Users/filopelor92/Documents/apri documento/numeri.txt", "r");
    	
    	if (file != NULL) {
    		
    		               printf("File opened successfully.\n");
    		
    	                  }
    	
     				 else {
    					 
    					   printf("File coudn't be opened,Program will exit");
    					    
    					 
    					  }
    	
    	while (!feof(file) && i < 3000) {
    		fscanf(file, "%d", &numbers[i]);
    		i++;
    	}
    	
    	printf("The numbers are:\n");
    	
    	for(j=0 ; j<i ; j++) {
    		printf("%d\n", numbers[j]);
    	}
    	fclose(file);
    	
    	if ( fclose(file) == 0 ) {
    		printf("file chiuso con successo");
    	                     }
    	return 0;
    }
    	
    mi ritornano un sacco di numeroni strani che non ci sono nel file dato che il suo contenuto è questo:
    93 93 93
    93 93 93
  • filopelor92 ha scritto:


    (ho aggiunto un i++; nel ciclo while)
    Sorry: me lo ero dimenticato io.

    feof() verifica che il file sia finito solo dopo la lettura di fscanf(), quindi i viene incrementato di una posizione. Il range dell'array stampabile va da 0 a ( i - 1).
     
    	while (!feof(file) && i < 3000) {
    		fscanf(file, "%d", &numbers[i]);
    		i++;
    	}
    	
    	printf("The numbers are:\n");
    	
    	for(j=0 ; j < ( i - 1 ); j++)  { // parentesi per evidenziare.
    		printf("%d\n", numbers[j]);
    	}
    
  • Purtroppo i numeracci strani rimangono quindi penso il problema non fosse questo;
    ed io essendo come avrete capito un principiante non so dove sbattere la testa
  • Il codice (con le correzioni indicate) funziona, quindi presumo che il problema sia nel file.
    Comunque dire "numeracci" non significa nulla se non posti un pò dell'output.
  • Purtoppo non posso allegare il file questo è il contenuto copiato ed incollato
    93 93 93
    93 93 93

    e una parte di numeri
    File opened successfully.
    The numbers are:
    6852240
    0
    5904
    0
    4096
    32
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    0
    1606407056
    32767
    1536
    1
    1606405920
    32767
    1606407056
    32767
    0
    0
    1606404608
    32767
    1606439487
    32767
    0
    0
    -1856350466
    1627360855
    0
    0
    1606407056
    32767
    1606405920
    32767
    1536
    1
    1536
    1
    0
    0
    1606405744
    32767
    1606441374
    32767
    1606405920
    32767
    1606407056
    32767
    1536

    questi sono solo una parte (postarli tutti avrebbe intasato il forum) pero la cosa va avanti così con molti zeri
  • Il problema era nel file si grazie a tutti
Devi accedere o registrarti per scrivere nel forum
9 risposte