Pagina 1 di 2

problema percorso file

Inviato: mer 13 mag 2009, 13:56
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

Re: problema percorso file

Inviato: mer 13 mag 2009, 14:12
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!

Re: problema percorso file

Inviato: mer 13 mag 2009, 14:15
da Blallo
ma cio non risolve il problema...gli do il percorso
/home/nomeutente/ecc ecc
e non va...

Re: problema percorso file

Inviato: mer 13 mag 2009, 16:58
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);
}

Re: problema percorso file

Inviato: mer 13 mag 2009, 18:07
da Blallo
nada...warning spariti ma mi da sempre errore:(

Re: problema percorso file

Inviato: mer 13 mag 2009, 18:13
da Mercyful
scusa come lo esegui/compili...??

Re: problema percorso file

Inviato: mer 13 mag 2009, 18:31
da Blallo
uso codeblocks come IDE....e poi lo eseguo da console

Re: problema percorso file

Inviato: mer 13 mag 2009, 18:53
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?

Re: problema percorso file

Inviato: mer 13 mag 2009, 18:57
da Blallo
wow così va....
allora è l'IDE che non mi fa rispettare i path....grazie mille!

Re: problema percorso file

Inviato: mer 13 mag 2009, 19:11
da Mercyful
prego, di niente! :thumbright:

Re: problema percorso file

Inviato: mer 13 mag 2009, 21:32
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!

Re: problema percorso file

Inviato: mer 13 mag 2009, 21:38
da Blallo
in che senso non potrebbe essere convertibile?

Re: problema percorso file

Inviato: mer 13 mag 2009, 21:55
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.

Re: problema percorso file

Inviato: mer 13 mag 2009, 23:01
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)

Re: problema percorso file

Inviato: gio 14 mag 2009, 12:08
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);
}