Pagina 1 di 2

[C] creare un nuovo file con percorso diverso

Inviato: giovedì 11 giugno 2015, 19:57
da errullaiolo
Voglio poter decidere dove verrà creato il mio nuovo file.
Ho provato:

Codice: Seleziona tutto

 sprintf(nomeFile,"$HOME/Desktop/");
  fp=fopen(nomeFile, "w");
  if(fp<0) error("file");
Avete qualche consiglio?? :muro:

Re: [C] creare un nuovo file con percorso diverso

Inviato: giovedì 11 giugno 2015, 20:35
da gila75
Una possibile implementazione:

Codice: Seleziona tutto

#include<stdlib.h>
#include<stdio.h>
#include <string.h>

int main() 
{
    FILE *fd;
    char origin[100];
    int len;

    printf ("immetti percorso+nome file: ");
    fgets (origin, 100, stdin);
    len = strlen(origin);
    len--;
    origin[len] = '\0';

    fd=fopen(origin, "w");
    if( fd==NULL ) 
    {
        perror("Errore in apertura del file");
        exit(1);
    }
    
    fclose(fd);
    return 0;
}

la funzione di input stringa andrebbe messa in una funzione...ho fatto di fretta
Logicamente una battitura di percorso errato mia_cartella//file.txt (per esempio) produrrebbe un fallimento.
L limite puoi implementare anche una verifica, altrimenti non sai se è fallita la creazione del file, o se è per colpa del percorso

Re: [C] creare un nuovo file con percorso diverso

Inviato: giovedì 11 giugno 2015, 20:39
da errullaiolo
Mi sono spiegato male chiedo scusa.
L'unico input sarà la stringa del nome del file. La decisione del percorso lo programmo io. In questo caso ogni file creato dovrebbe andare nel Desktop.

Re: [C] creare un nuovo file con percorso diverso

Inviato: giovedì 11 giugno 2015, 20:46
da gila75
Così come l'ho scritto io avendo il file in scrivania, se digito file.txt, essendo già li sul terminale:

Codice: Seleziona tutto

gila@ubuntu:~/Scrivania$ 
mi finisce in scrivania col nome che ho immesso.
al limite se non sei in scrivania, puoi prepararti il percorso che ti dirotta sul desktop
EDIT:

Comunque ci eri arrivato da solo:

Codice: Seleziona tutto

sprintf(nomeFile,"$HOME/Desktop/");
  fp=fopen(nomeFile, "w");
  if(fp<0) error("file");
con un'altro input immetti il nome del file, poi con strcat concateni a nomeFile...non ho provato, ma grosso modo è così

Re: [C] creare un nuovo file con percorso diverso

Inviato: giovedì 11 giugno 2015, 21:14
da errullaiolo
Però non mi funziona -.-

Re: [C] creare un nuovo file con percorso diverso

Inviato: giovedì 11 giugno 2015, 21:25
da gila75
Però non mi funziona -.-
Cosa non funziona?
Posta il tuo programma completo magari.
Ora non posso, ma se non ti aiuta nessuno domani provo a vedere, ma mi sa che sei vicino
Magari l'errore è altrove

Re: [C] creare un nuovo file con percorso diverso

Inviato: giovedì 11 giugno 2015, 21:29
da crap0101
gila75 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4767789#p4767789][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto: EDIT:

Comunque ci eri arrivato da solo:

Codice: Seleziona tutto

sprintf(nomeFile,"$HOME/Desktop/");
  fp=fopen(nomeFile, "w");
  if(fp<0) error("file");
ovviamente così non funziona, non stai usando la shell che può espandere $HOME al percorso della home.

Re: [C] creare un nuovo file con percorso diverso

Inviato: giovedì 11 giugno 2015, 21:37
da gila75
@crap0101
Onestamente ho guardato male, e non si è capito bene qual'è il problema.
io mi preparerei un percorso (se necessario, ma ripeto, non si capisce), poi al limite concatenerei il nome del file e lo
darei in pasto come primo argomento della fopen, concordi?

Re: [C] creare un nuovo file con percorso diverso

Inviato: giovedì 11 giugno 2015, 21:45
da vbextreme
se vuoi il percorso della home,clicca sulla mia firma "easyframework" portati dentro alla directory "easyfile" e apri il file "efile.c" portati alla riga 170 ecco come usarla per il tuo caso:

Codice: Seleziona tutto

sprintf(nomefile,"%s/Desktop/%s",pht_homedir(),"nuovofile");
fopen(nomefile,"w");
...

Re: [C] creare un nuovo file con percorso diverso

Inviato: venerdì 12 giugno 2015, 1:15
da errullaiolo
Grazie l'ho visto adesso il mio frammento è questo e funzionante. Conviene appendere le successive stringhe alla fine con strcat o all'inizio con sprintf?

Codice: Seleziona tutto

path = getenv("HOME");
  strcat(path, "/Desktop/");
  strcat(path, nameFile);
  printf("PATH = %s",path);
  fp=fopen(path, "w");
  if(fp<0) error("file");
  exit(0);

Re: [C] creare un nuovo file con percorso diverso

Inviato: venerdì 12 giugno 2015, 3:18
da vbextreme
la migliore è snprintf()

Re: [C] creare un nuovo file con percorso diverso

Inviato: venerdì 12 giugno 2015, 21:13
da gila75
Grazie l'ho visto adesso il mio frammento è questo e funzionante. Conviene appendere le successive stringhe alla fine con strcat o all'inizio con sprintf?
io su i due piedi avevo detto strcat, ma insomma, non sono un programmatore :D
Ascolta Vb

EDIT:
la migliore è snprintf()
Però sai che facendo ricerche sembrerebbe più leggibile e veloce strcat? Io personalmente la trovo più semplice ed intuitiva.

Re: [C] creare un nuovo file con percorso diverso

Inviato: venerdì 12 giugno 2015, 21:40
da vbextreme
La strcat in teoria è insicura perchè non controlla la dimensione del buffer di destinazione, almeno la strncat.
Non so poi di performance quanto possa essere piu veloce la strcat rispetto alla snprintf ed in piu è sicuramente piu leggibile codice scritto con la snprintf rispetto alla strncat.

Re: [C] creare un nuovo file con percorso diverso

Inviato: venerdì 12 giugno 2015, 23:00
da errullaiolo
la snprintf nemmeno controlla la dimensione del buffer a quanto ho notato, ma se non erro ha bisogno di un altro buffer ausiliario.

Codice: Seleziona tutto

char variable[256];
char arr[] = "WORLD";
snprintf(variable, 256, "%s %s", "HELLO", arr);
printf ("Resultat : %s\n", variable);

Re: [C] creare un nuovo file con percorso diverso

Inviato: venerdì 12 giugno 2015, 23:25
da vbextreme
e come no?

Re: [C] creare un nuovo file con percorso diverso

Inviato: venerdì 12 giugno 2015, 23:35
da errullaiolo
Si scusa.

Codice: Seleziona tutto

   char variable[1];
    snprintf(variable, 256, "%s %s", "HELLO", "WORLD");
    printf ("Resultat : %s\n", variable);
    printf("LEN = %d\n", strlen(variable));
Così facendo mi ritorna 11 la nuova lunghezza del buffer variable. Quindi fa una realloc e inserisce la nuova stringa.

Re: [C] creare un nuovo file con percorso diverso

Inviato: venerdì 12 giugno 2015, 23:51
da errullaiolo
Non fa nessuna realloc conviene utilizzare un buffer ausiliario, altrimenti sballa tutto. Attenzione!!!

Codice: Seleziona tutto

    char msg[] = "PRIMO";
    char variable[1];
    snprintf(variable, 256, "%s %s", "HELLO", "WORLD");
    printf ("Resultat : %s\n", variable);
    printf("LEN = %d\n", strlen(variable));
    printf("%s\n",msg);

Re: [C] creare un nuovo file con percorso diverso

Inviato: sabato 13 giugno 2015, 10:26
da vbextreme
secondo me devi studiare un pò di piu!!!!!!!!!!!!!!!!!!!!!!!!!!!

snprintf( BUFFER, DIMENSIONEBUFFER, FORMAT, VARARG);

BUFFER è il buffer dove andrai a scrivere FORMAT + le VARARG
DIMENSIONEBUFFER è la dimensione massima del tuo buffer.
è ovvio che se il tuo buffer misura 1 carattere e tu dici alla snprintf che hai un buffer di 256 caratteri lui si impalla!

Codice: Seleziona tutto

char variable[1];
snprintf(variable, 1, "%s %s", "HELLO", "WORLD");
se hai la macchina in riserva che fai prosegui e poi ti lamenti che sei rimasto a piedi?

Re: [C] creare un nuovo file con percorso diverso

Inviato: sabato 13 giugno 2015, 10:31
da errullaiolo
Hai ragione. Non so come ringraziarti :D

Re: [C] creare un nuovo file con percorso diverso

Inviato: sabato 13 giugno 2015, 10:36
da errullaiolo
Avevo semplicemente attribuito la terza persona singolare a "Ello World".