Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Pannello QD-OLED da 32 pollici con risoluzione 4K, frequenza di aggiornamento a 240Hz e tempi di risposta rapidissimi: il Gigabyte MO32U24 evolve il progetto del suo predecessore MO32U e alza ulteriormente l'asticella delle prestazioni. È ancora una volta un monitor indirizzato ai giocatori più esigenti
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
realme 16 5G è un nuovo smartphone con sensore Sony IMX 852 da 50MP sul retro e uno specchio selfie fisico integrato nella camera bar, una prima nel segmento di mercato. Batteria da 6550mAh in un corpo da 8,1mm e 183g, certificazione IP69K e ricarica da 45W completano un pacchetto aggressivo per la fascia media, per uno dei prodotti più interessanti del produttore sul piano commerciale
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Sono ormai definitive le nuove norme del Codice della Strada per i monopattini elettrici. Non solo targa e assicurazione, le regole sono tante e riguardano diversi aspetti, vi spieghiamo come evitare sanzioni che possono essere salate
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 10-05-2011, 09:01   #1
JTL
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!
JTL è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2011, 09:50   #2
GByTe87
Senior Member
 
L'Avatar di GByTe87
 
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
GByTe87 è offline   Rispondi citando il messaggio o parte di esso
Old 11-05-2011, 12:55   #3
JTL
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!
JTL è offline   Rispondi citando il messaggio o parte di esso
Old 11-05-2011, 13:24   #4
GByTe87
Senior Member
 
L'Avatar di GByTe87
 
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
GByTe87 è offline   Rispondi citando il messaggio o parte di esso
Old 11-05-2011, 14:23   #5
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 13002
Aggiungo che se fosse necessario concatenare le stringhe, potresti usare strncpy o snprintf .

Bada bene ovviamente ad allocare la giusta quantità di memoria.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 11-05-2011, 14:56   #6
JTL
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");
ecco quello che vorrei fare:
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"*/
JTL è offline   Rispondi citando il messaggio o parte di esso
Old 11-05-2011, 16:00   #7
ingframin
Senior Member
 
L'Avatar di ingframin
 
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 16:04. Motivo: Problemi con internet explorer, non avevo finito il post
ingframin è offline   Rispondi citando il messaggio o parte di esso
Old 11-05-2011, 16:08   #8
GByTe87
Senior Member
 
L'Avatar di GByTe87
 
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
GByTe87 è offline   Rispondi citando il messaggio o parte di esso
Old 12-05-2011, 08:41   #9
JTL
Member
 
Iscritto dal: Oct 2009
Messaggi: 83
Quote:
Originariamente inviato da ingframin Guarda i messaggi
ma alla fine poi fai fclose(fpt2)?
Altriementi non credo che il file venga scritto su disco
Si fclose lo metto
Quote:
Originariamente inviato da ingframin Guarda i messaggi
//perche' un puntatore?
ho copiato male...

Adesso mi studio le funzioni itoa e sprintf, che non conosco bene, poi vi faccio sapere!
grazie!
JTL è offline   Rispondi citando il messaggio o parte di esso
Old 12-05-2011, 09:01   #10
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da JTL Guarda i messaggi
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");
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!


Quote:
Originariamente inviato da JTL Guarda i messaggi
ecco quello che vorrei fare:
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"*/
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'
(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
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 12-05-2011, 10:11   #11
JTL
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:
Originariamente inviato da sottovento Guarda i messaggi
Codice:
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:
Codice:
char nome[11] ;
nome="nome_file";
insomma come succede quando ho a che fare con vettori, che li posso definire nei due modi...
Ciao!
JTL è offline   Rispondi citando il messaggio o parte di esso
Old 12-05-2011, 10:34   #12
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da JTL Guarda i messaggi
Ma non è la stessa cosa di scrivere:
Codice:
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
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 12-05-2011, 10:38   #13
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 13002
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);
}
Ottenendo ad esempio questo output:
Codice:
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:

Codice:
file_0000
file_0001
file_0002
file_0003
file_0004

Ultima modifica di WarDuck : 12-05-2011 alle 10:46.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming Gigabyte MO32U24 OLED: il 4K a 240Hz su un panne...
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh Recensione realme 16 5G: lo smartphone con Selfi...
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni Come rispettare tutte le nuove regole per i mono...
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta DLSS 4.5: con Dynamic Frame Generation e MFG 6X ...
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere) Plaud NotePin S, il registratore IA si fa indoss...
FTX, la Corte d'Appello conferma la cond...
OnePlus anticipa l'arrivo di nuove cuffi...
YouTube da record con 2,7 miliardi di ut...
Samsung Galaxy Watch Ultra 2, l'autonomi...
Deezer ha rilasciato un tool gratuito pe...
AMD Ryzen 9 7950X3D danneggiato: approva...
I Mac con chip Apple Silicon hanno meno ...
Scandalo nel Regno Unito: agente sotto i...
TOP 15 offerte Amazon del weekend: 10 tu...
DJI Neo Fly More Combo a 245€: il mini d...
JBL Live Beam 3 a 129€ invece di 199€ su...
L'FBI ha costruito una città segr...
AMD usa il MacBook Neo come bersaglio in...
Intel prepara 'Raptor Lake Next'? Nel 20...
Una telefonata del CEO di Amazon dietro ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 17:01.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v