DOMANDA File Linguaggio C

Pubblicità

saro1995

Nuovo Utente
Messaggi
82
Reazioni
3
Punteggio
27
Ragazzi sto avendo un piccolo problemi con la gestione dei file in linguaggio C. In sostanza ho scritto il codice ma al momento di aprire il file "prova.txt" non lo apre e mi dice che non esiste. Io programmo con visual studio, forse ho pensato che sbaglio a inserire il file. Il file l'ho messo nella stessa cartella del codice sorgente.
questo è il codice:
#include <stdio.h>
#include <stdlib.h>
#define dim 30
typedef struct {
char cognome[31], nome[31], sesso[2];
int anno;
}persona;
int main() {
persona v[dim]; int k = 0; FILE* fp;
if ((fp = fopen("people.txt", "r")) == NULL) {
perror("Il file non esiste");
exit(1);
}
while (fscanf(fp, "%s%s%s%d\n", v[k].cognome, v[k].nome, v[k].sesso, v[k].anno) != EOF)
k++;
}
 
Con visual studio il programma per default non parte nella cartella del codice sorgente bensì in una sottocartella 'bin' a seconda se il target è debug o release. Per essere sicuro specifica il persorso completo del file che vuoi leggere.
 
Con visual studio il programma per default non parte nella cartella del codice sorgente bensì in una sottocartella 'bin' a seconda se il target è debug o release. Per essere sicuro specifica il persorso completo del file che vuoi leggere.
Adretti60 non capisco cosa vuoi dire. Io mi sono informato con mio amico che ha un mac e usa xcod, lui mette il file nella stessa cartella del codice sorgente. Ho provato a creare il file nella cartella del debug senza risultati. Se è possibile ditemi come fare con visual studio perchè non posso continuare l'esercizio altrimenti... Grazie come sempre! <3
 
Non ascoltare gli amici che programmano in xcode, e' diverso.
Le nuove versioni di DevStudio creano sottocartelle nella cartella originale dove mettono eseguibili e oggetti. Per esempio guarda lo screenshot che ho aggiunto: il mio codice e' nella cartella Test, ma l'esegubile e' nella sottocartella bin\Debug o bin\Release (a seconda della configurazione che si compila). Puoi anche cambiare la cartella "working" (ossia la cartella dove il programma gira) andando nelle proprieta' del progetto e spulciando fino a trovare un campo dove specificare tale cartella (tipicamente nella pagina Debug, il campo "Working directory"), dipende che versione di DevStudio usi.
Per questo motivo ti ho suggerito di usare nel tuo codice il percorso completo del documento, per esempio "C:\MyUtils\Data\prova.txt" invece che semplicemente il nome del file, cosi' sei sicuro che apre proprio il file che vuoi. E' il metodo piu' sicuro.
 

Allegati

  • Capture.webp
    Capture.webp
    2.7 KB · Visualizzazioni: 26
Non ascoltare gli amici che programmano in xcode, e' diverso.
Le nuove versioni di DevStudio creano sottocartelle nella cartella originale dove mettono eseguibili e oggetti. Per esempio guarda lo screenshot che ho aggiunto: il mio codice e' nella cartella Test, ma l'esegubile e' nella sottocartella bin\Debug o bin\Release (a seconda della configurazione che si compila). Puoi anche cambiare la cartella "working" (ossia la cartella dove il programma gira) andando nelle proprieta' del progetto e spulciando fino a trovare un campo dove specificare tale cartella (tipicamente nella pagina Debug, il campo "Working directory"), dipende che versione di DevStudio usi.
Per questo motivo ti ho suggerito di usare nel tuo codice il percorso completo del documento, per esempio "C:\MyUtils\Data\prova.txt" invece che semplicemente il nome del file, cosi' sei sicuro che apre proprio il file che vuoi. E' il metodo piu' sicuro.
SI ho capito... Però io devo fare l'esame e al professore devo consegnare solo il codice sorgente. Ci sta un modo per inserire la cartella che creo per il collegamento all'interno del programma? Cioè non so se mi spiego... il professore non lo corregge nel pc in cui programmo ma nel suo, che ovviamente non ci sarà il file.
 
SI ho capito... Però io devo fare l'esame e al professore devo consegnare solo il codice sorgente. Ci sta un modo per inserire la cartella che creo per il collegamento all'interno del programma? Cioè non so se mi spiego... il professore non lo corregge nel pc in cui programmo ma nel suo, che ovviamente non ci sarà il file.
Allora non utilizzare soltanto C++/CLI o funzioni safe (fopen_s ad esempio).
Automaticamente quando si apre un file viene creato/aperto nella cartella dove ci sono gli headers. L’eseguibile è in una altra cartella (Debug/Release) ma affinché tu esegui da VisualStudio non avrai problemi.
Il source code è quindi valido per tutti i compilatori.
 
Capito. Quindi devi trasferire (o il prof trasferisce) l'eseguibile dal tuo computer al suo. Solo l'eseguibile o tutto il codice? lancia l'eseguibile da terminale o da DevStudio? Prima di risponderti devo sapere i dettagli.
 
Sembra ragionevole.
Una semplice modifica al codice originale sarebbe di chiedere di digitare il nome del file, leggerlo con una scanf e metterlo in una variabile usata poi per aprirlo. In questo modo sta all’utente di mettere il persorso corretto del file (che a questo punto può essere ovunque)

PS se la fopen ritorna NULL, non necessariamente vuole dire che il file non esista, ci possono essere altre possibilità di errore (tipo non avere permesso di aprirlo). Vedi esempi qui:
https://stackoverflow.com/questions/1746510/unable-to-open-a-file-with-fopen
 
Guarda, questo è il codice che sto usando per i file. Dimmi cosa ne pensi:
int CaricaLista(char *nomefile, TListaProdotti *plis) {
FILE* f;
TProdotto prodotto;
int nletti = 0;

if ((f = fopen(nomefile, "r")) == NULL) {
printf("Errore nell'apertura del file.\n");
exit(1);
}

*plis = NULL;

while (!feof(f)) {
if (fscanf(f, "%s\n%s\n", prodotto.cod_prodotto,
prodotto.cod_categoria) != 2)
break;

if (fgets(prodotto.descrizione, sizeof(prodotto.descrizione), f) == NULL)
break;
// Elimino lo \n da prodotto.descrizione
prodotto.descrizione[strlen(prodotto.descrizione) - 1] = '\0';

if (fscanf(f, "%d\n%f", &prodotto.nprodotti, &prodotto.costo) != 2)
break;
InserisciInListaOrdinataProdotti(plis, prodotto);
nletti++;
}

fclose(f);

return nletti;
}
 
più che altro è una funzione... così dovrebbe andare meglio. Ognuno mette il file che vuole e poi basta inserire il nome del file ed è fatta...
 
Pubblicità
Pubblicità
Indietro
Top