DOMANDA File Linguaggio C

saro1995

Nuovo Utente
82
3
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++;
}
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Tu dici di provare ad aprire il file prova.txt ma nel codice hai scritto people.txt :boh:
 
  • Mi piace
Reazioni: saro1995

Andretti60

Utente Èlite
6,440
5,091
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.
 
  • Mi piace
Reazioni: saro1995

saro1995

Nuovo Utente
82
3
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
 

Andretti60

Utente Èlite
6,440
5,091
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.JPG
    Capture.JPG
    12 KB · Visualizzazioni: 26
  • Mi piace
Reazioni: saro1995

saro1995

Nuovo Utente
82
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.
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.
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
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.
 

Andretti60

Utente Èlite
6,440
5,091
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.
 

Andretti60

Utente Èlite
6,440
5,091
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
 

saro1995

Nuovo Utente
82
3
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;
}
 

saro1995

Nuovo Utente
82
3
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...
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili