problema percorso file

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

problema percorso file

Messaggio da Blallo »

salve ragazzi, sto usando per la prima volta i file in C e ho un problema con questo:

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
#define MAXNUM 80

int main()
{
    char file[MAXNUM];
    FILE *fp;
    int v, max, min, count=0, somma;
    printf("Inserisci percorso file:");
    gets(file);

    if ((fp=fopen("file","r"))==NULL)
    {
        fprintf(stderr, "Errore");
        return EXIT_FAILURE;
    }

    if ((fscanf(fp, "%d", &v))!=EOF)
    {
        max=min=somma=v;
        count++;
    }
    else
    {
        fprintf(stderr, "File Vuoto");
        return EXIT_FAILURE;
    }

    while ((fscanf(fp, "%d", &v))!=EOF)
    {
        count++;
        somma+=v;
        if (v>max)
            max=v;
        else if (v<min)
            min=v;
    }

    printf("Massimo:%d\n Minimo:%d\n Somma:%d\n Media:%d\n Numero Valori:%d", max, min, somma, somma/count, count);
    fclose(fp);
}
Tutto bene (anche se mi da 2 warning), ma quando vado per dargli il percorso non va...è come se non lo trovasse

Avatar utente
paolo86
Linux 0.x
Linux 0.x
Messaggi: 73
Iscritto il: lun 14 lug 2008, 19:22
Nome Cognome: Paolo Cortis
Slackware: Slackware64 current
Kernel: 3.4.1-jiraiya
Desktop: KDE 4.8.2
Località: Cagliari
Contatta:

Re: problema percorso file

Messaggio da paolo86 »

file è una variabile... non la devi mettere tra apici. devi scriverla così:

Codice: Seleziona tutto

    if ((fp=fopen(file, "r"))==NULL)
Per i warning.... evita assolutamente di usare la funzione gets...
'man 3 gets' ha scritto: ...
BUGS
Never use gets(). Because it is impossible to tell without knowing the data in advance how many characters gets() will read, and because gets() will continue to store characters past the end of the buffer, it is extremely dangerous to use. It has been used to break computer security. Use fgets() instead.
...
Al posto di gets usa fgets è meglio.

Ciao!

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: problema percorso file

Messaggio da Blallo »

ma cio non risolve il problema...gli do il percorso
/home/nomeutente/ecc ecc
e non va...

Avatar utente
Mercyful
Linux 1.x
Linux 1.x
Messaggi: 196
Iscritto il: ven 25 lug 2008, 18:20
Nome Cognome: Ilario Pittau
Slackware: 13.0
Kernel: 2.6.29.6-generic
Desktop: xfce 4.6
Località: Torino

Re: problema percorso file

Messaggio da Mercyful »

leggendolo così dovrebbe funzionare, tenedo conto dei seguenti accorgimenti:
- nel path inserito non ci devono essere spazi
- il path non deve essere lungo più di 79 caratteri
- il file non deve contenere stringhe o elementi che non sono numeri.


quello che ho provato è questo:

Codice: Seleziona tutto

 
#include <stdio.h>
#include <stdlib.h>
#define MAXNUM 80

int main()
{
    char file[MAXNUM];
    FILE *fp;
    int v, max, min, count=0, somma;
    printf("Inserisci percorso file:");
    //gets(file);
    scanf("%s",file);

    if ((fp=fopen(file,"r"))==NULL)
    {
        fprintf(stderr, "Errore\n");
        return EXIT_FAILURE;
    }

    if ((fscanf(fp, "%d", &v))!=EOF)
    {
        max=min=somma=v;
        count++;
    }
    else
    {
        fprintf(stderr, "File Vuoto");
        return EXIT_FAILURE;
    }

    while ((fscanf(fp, "%d", &v))!=EOF)
    {
        count++;
        somma+=v;
        if (v>max)
            max=v;
        else if (v<min)
            min=v;
    }

    printf("Massimo:%d\n Minimo:%d\n Somma:%d\n Media:%d\n Numero Valori:%d\n", max, min, somma, somma/count, count);
    fclose(fp);
}

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: problema percorso file

Messaggio da Blallo »

nada...warning spariti ma mi da sempre errore:(

Avatar utente
Mercyful
Linux 1.x
Linux 1.x
Messaggi: 196
Iscritto il: ven 25 lug 2008, 18:20
Nome Cognome: Ilario Pittau
Slackware: 13.0
Kernel: 2.6.29.6-generic
Desktop: xfce 4.6
Località: Torino

Re: problema percorso file

Messaggio da Mercyful »

scusa come lo esegui/compili...??

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: problema percorso file

Messaggio da Blallo »

uso codeblocks come IDE....e poi lo eseguo da console

Avatar utente
Mercyful
Linux 1.x
Linux 1.x
Messaggi: 196
Iscritto il: ven 25 lug 2008, 18:20
Nome Cognome: Ilario Pittau
Slackware: 13.0
Kernel: 2.6.29.6-generic
Desktop: xfce 4.6
Località: Torino

Re: problema percorso file

Messaggio da Mercyful »

non saprei.. io faccio tutto da console in questo modo

Codice: Seleziona tutto

mercyful:~$ cd /home/mercyful/Desktop/synchronize/provec/
mercyful:~/Desktop/synchronize/provec$ gcc t.
t.c     t.c~    t.txt   t.txt~
mercyful:~/Desktop/synchronize/provec$ gcc t.c ; ./a.out
Inserisci percorso file:/home/mercyful/Desktop/synchronize/provec/t.txt
Massimo:23
 Minimo:2
 Somma:66
 Media:8
 Numero Valori:8
mercyful:~/Desktop/synchronize/provec$ cat t.txt
12
2
3
5
6
7
8 23
mercyful:~/Desktop/synchronize/provec$
provaci te, sei sicuro di aver rispettato tutti i punti?

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: problema percorso file

Messaggio da Blallo »

wow così va....
allora è l'IDE che non mi fa rispettare i path....grazie mille!

Avatar utente
Mercyful
Linux 1.x
Linux 1.x
Messaggi: 196
Iscritto il: ven 25 lug 2008, 18:20
Nome Cognome: Ilario Pittau
Slackware: 13.0
Kernel: 2.6.29.6-generic
Desktop: xfce 4.6
Località: Torino

Re: problema percorso file

Messaggio da Mercyful »

prego, di niente! :thumbright:

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: problema percorso file

Messaggio da Mario Vanoni »

jimmy_page_89 ha scritto:wow così va....
allora è l'IDE che non mi fa rispettare i path....grazie mille!
Rimane un errore:

if ((fscanf(fp, "%d", &v))!=EOF)
{
max=min=somma=v;
count++;
}
else
{
fprintf(stderr, "File Vuoto");
return EXIT_FAILURE;
}

man fscanf:

RETURN VALUE
These functions return the number of input items successfully matched and assigned, which can be fewer than provided for, or even zero in the event of an early matching failure.

Se la riga letta non e` convertibile, fscanf ritorna 0 (zero),
ed il tuo else aspetta Godot, EOF == -1!

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: problema percorso file

Messaggio da Blallo »

in che senso non potrebbe essere convertibile?

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: problema percorso file

Messaggio da Mario Vanoni »

jimmy_page_89 ha scritto:in che senso non potrebbe essere convertibile?
Metti che una sola riga del file contenga
###
provare per crederci.

fscanf ritorna 0,
ed il suo else aspetta Godot.

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: problema percorso file

Messaggio da Blallo »

quindi a questo punto mi conviene mettere un altro controllo all'inizio in modo che verifichi che siano tutti numeri? (perchè solo di numeri ha bisogno)

Avatar utente
ulisse89
Packager
Packager
Messaggi: 643
Iscritto il: sab 17 gen 2009, 12:53
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce
Località: Bologna

Re: problema percorso file

Messaggio da ulisse89 »

Potresti mettere di volta in volta l'output della fscanf in una variabile intera. Poi se è = 0 allora ignori ciò che ha letto, se è > 0 fai ciò che devi fare, se è EOF allora termini il ciclo.
Per esempio:

Codice: Seleziona tutto

int a = fscanf(fp, "%d", &v);
while(a  != EOF)
{
	if(a = 0)
		;
	else
	{
		count++;
        somma+=v;
        if (v>max)
            max=v;
        else if (v<min)
            min=v;
        }
        
        a = fscanf(fp, "%d", &v);
}

Rispondi