PDA

View Full Version : [ansi C] argomento funzione fopen()


JTL
10-05-2011, 10:01
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!

GByTe87
10-05-2011, 10:50
Senza problemi!

ad esempio...


void openFile (const char * fileName) {
fd = fopen(fileName, "r")
...
}



:)

JTL
11-05-2011, 13:55
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!

GByTe87
11-05-2011, 14:24
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. ;)

WarDuck
11-05-2011, 15:23
Aggiungo che se fosse necessario concatenare le stringhe, potresti usare strncpy o snprintf ;).

Bada bene ovviamente ad allocare la giusta quantità di memoria.

JTL
11-05-2011, 15:56
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)

GByTe87
11-05-2011, 17:08
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);

JTL
12-05-2011, 09:41
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,....).

JTL
12-05-2011, 11:11
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

WarDuck
12-05-2011, 11:38
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