|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Oct 2009
Messaggi: 83
|
[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! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Senza problemi!
ad esempio... Codice:
void openFile (const char * fileName) {
fd = fopen(fileName, "r")
...
}
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Oct 2009
Messaggi: 83
|
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! |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Quella era una funzione di esempio, recuperata al momento.
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.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12919
|
Aggiungo che se fosse necessario concatenare le stringhe, potresti usare strncpy o snprintf
Bada bene ovviamente ad allocare la giusta quantità di memoria. |
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Oct 2009
Messaggi: 83
|
Grazie ragazzi ma non ho le idee molto chiare...
Ecco quello che riesco a fare: Codice:
char *nome; nome=(char*)malloc(11*sizeof(char)); nome= "nome_file"; fpt2=fopen(nome, "w"); Codice:
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"*/ |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
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) Ultima modifica di ingframin : 11-05-2011 alle 17:04. Motivo: Problemi con internet explorer, non avevo finito il post |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Io sostituire itoa con sprintf, visto che la prima da sempre un sacco di rogne [non standard, ecc
Codice:
char fileName[20]; int x = 0001; sprintf(fileName, "file_%d.bin", x);
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
#9 | |
|
Member
Iscritto dal: Oct 2009
Messaggi: 83
|
Quote:
ho copiato male... Adesso mi studio le funzioni itoa e sprintf, che non conosco bene, poi vi faccio sapere! grazie! |
|
|
|
|
|
|
#10 | ||
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
- 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! Quote:
char nome[11] e non pensarci piu' (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,....).
__________________
In God we trust; all others bring data |
||
|
|
|
|
|
#11 | |
|
Member
Iscritto dal: Oct 2009
Messaggi: 83
|
Ok, sto usando snprintf(), grazie mille a tutti per la pazienza!
già che ci sono, vorrei togliermi un dubbio: Quote:
Codice:
char nome[11] ; nome="nome_file"; Ciao! |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
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
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12919
|
Se il prefisso del file è sempre lo stesso, io farei una cosa del genere:
Codice:
#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);
}
Codice:
file_0 file_1 file_2 file_3 file_4 Codice:
file_0000 file_0001 file_0002 file_0003 file_0004 Ultima modifica di WarDuck : 12-05-2011 alle 11:46. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:54.




















