View Full Version : [ansi C] argomento funzione fopen()
Ciao a tutti.
Vorrei sapere se è possibile usare la funzione fopen("nome", "w") (o una analoga) per creare un file in cui "nome" è una variabile, ad esempio contiene l'ora in cui l'eseguibile viene lanciato, oppure se può contenere un parametro.
Grazie!
Senza problemi!
ad esempio...
void openFile (const char * fileName) {
fd = fopen(fileName, "r")
...
}
:)
Grazie, GByTe87!
Però sono troppo novellino e non riesco a venire a capo del problema.
A questo punto dovrei assegnare a char il mio parametro (esempio la data o il numero di iterazioni che faccio fare al mio programma)
La domanda diventa: come metto un parametro nella variabile char?
ciao!
Quella era una funzione di esempio, recuperata al momento. :D
Il modo in cui generi il nome del file dipende da quello che vuoi che il tuo codice faccia.
Visto che parli di ora e data, ti consiglio di dare un occhio alle funzioni presenti in time.h, ad esempio time, localtime, ecc. ;)
Aggiungo che se fosse necessario concatenare le stringhe, potresti usare strncpy o snprintf ;).
Bada bene ovviamente ad allocare la giusta quantità di memoria.
Grazie ragazzi ma non ho le idee molto chiare...
Ecco quello che riesco a fare:
char *nome;
nome=(char*)malloc(11*sizeof(char));
nome= "nome_file";
fpt2=fopen(nome, "w");
ecco quello che vorrei fare:
int* param = 00001;
char *nome;
nome=(char*)malloc(11*sizeof(char));
nome= "file_?param?"; /*qui voglio creare una stringa che contiene "file_00001"*/
fpt2=fopen(nome, "w"); /*qui voglio creare una file dal nome"file_00001"*/
ingframin
11-05-2011, 17:00
ma alla fine poi fai fclose(fpt2)?
Altriementi non credo che il file venga scritto su disco
Io comunque farei:
int param = 00001;//perche' un puntatore?
char *nome;
nome=(char*)malloc(11*sizeof(char));
nome= strcat("file_",itoa(param)); /*qui crei la stringa che contiene "file_1"*/
fpt2=fopen(nome, "w");
fclose(fpt2)
Io sostituire itoa con sprintf, visto che la prima da sempre un sacco di rogne [non standard, ecc :mc: ]
char fileName[20];
int x = 0001;
sprintf(fileName, "file_%d.bin", x);
ma alla fine poi fai fclose(fpt2)?
Altriementi non credo che il file venga scritto su disco
Si fclose lo metto
//perche' un puntatore?
ho copiato male...:doh:
Adesso mi studio le funzioni itoa e sprintf, che non conosco bene, poi vi faccio sapere!
grazie!
sottovento
12-05-2011, 10:01
Grazie ragazzi ma non ho le idee molto chiare...
Ecco quello che riesco a fare:
char *nome;
nome=(char*)malloc(11*sizeof(char));
nome= "nome_file";
fpt2=fopen(nome, "w");
Attenzione:
- allochi della memoria e la assegni a nome;
- perdi la memoria allocata assegnandogli il puntatore a "nome_file";
Probabilmente intendevi copiare il "nome_file" nella memoria appena allocata. Prova con strcpy() o con sprintf (o con le sue varianti, tipo snprintf, ecc.).
Se allochi memoria, controlla che l'allocazione sia andata a lieto fine, cosi' da evitare problemi/crash "random" all'interno della tua applicazione. L'allocazione, l'apertura di file e cosi' via possono fallire ed il programma deve essere cosciente di questo!
ecco quello che vorrei fare:
int* param = 00001;
char *nome;
nome=(char*)malloc(11*sizeof(char));
nome= "file_?param?"; /*qui voglio creare una stringa che contiene "file_00001"*/
fpt2=fopen(nome, "w"); /*qui voglio creare una file dal nome"file_00001"*/
La sprintf (snprintf()) fa al caso tuo. Per inciso: puoi evitare di allocare dinamicamente lo spazio per il nome del file, visto che gli assegni un valore fisso... a questo punto dichiaralo semplicemente come
char nome[11]
e non pensarci piu' :D
(a dire il vero assegnerei piu' spazio, 10 caratteri sono davvero pochi, e l'esempio di nome che hai dato puo' essere ospitato giusto giusto. Poi ti accorgi che vuoi assegnare anche la directory,....).
Ok, sto usando snprintf(), grazie mille a tutti per la pazienza! :)
già che ci sono, vorrei togliermi un dubbio:
char *nome;
nome=(char*)malloc(11*sizeof(char));
nome= "nome_file";
Attenzione:
- allochi della memoria e la assegni a nome;
- perdi la memoria allocata assegnandogli il puntatore a "nome_file";
Ma non è la stessa cosa di scrivere:
char nome[11] ;
nome="nome_file";
insomma come succede quando ho a che fare con vettori, che li posso definire nei due modi...
Ciao!
sottovento
12-05-2011, 11:34
Ma non è la stessa cosa di scrivere:
char nome[11] ;
nome="nome_file";
L'istruzione che hai riportato qui non e' un'istruzione valida in C.
Come saprai, i vettori sono rappresentati dal puntatore al primo elemento. Sono un indirizzo, quindi. L'istruzione in oggetto cerca di rimpiazzare l'indirizzo contenuto nella variabile nome con quello della string "nome_file".
In realta', vuoi fare una cosa piu' semplice, cioe' assegnare a nome il valore, "nome_file", cioe' copiare l'area di memoria puntata dai due puntatori. Per questo usi le funzioni di cui sopra
Se il prefisso del file è sempre lo stesso, io farei una cosa del genere:
#define MAX_PATH 256
char str[MAX_PATH];
int i;
for (i=0; i < 5; i++)
{
snprintf(str, MAX_PATH, "file_%d", i); // scrivo la stringa in str
printf("%s\n", str);
}
Ottenendo ad esempio questo output:
file_0
file_1
file_2
file_3
file_4
Volendo puoi giocare con il formato, ad esempio al posto di %d puoi usare %04d per ottenere una cosa del genere:
file_0000
file_0001
file_0002
file_0003
file_0004
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.