[C] Metodi di apertura file, e scrittura.

cristian.migotto
Per aprire un file passando gli argomenti da linea di comando utilizzo:
#include <stdio.h>
#include <stdlib.h>
int main(int argc char *argv)
{
    FILE *f; 
if (argc != 2)
    {
        fprintf(stderr, "Argomenti non corretti\n");
        exit(1); 
    }
if ( (f=fopen(argv[1], "r")) == NULL)
    {
        fprintf(stderr, "File %s non valido.\n", argv[1]);
        exit(1); // non e' possibile rimediare
    }

....
}


Ed è un ottima soluzione solo che per testare il programma completo dovrei ogni volta farlo partire da linea di comando, e non avrei a disposizione il debug.
Il metodo alternativo per aprire un file in una cartella o nella stessa directory del programma quale è?

Inoltre volevo sapere, quando scrivo una riga nel file con la fprintf es:

FILE *f;
....
fprintf(f,"Ciao mondo!%c");
fprintf(f,"Ciao mondo!%c");
....


Il programma scriverà
Ciao mondo!
Ciao mondo!
Oppure sulla stessa linea Ciao mondo!Ciao mondo!
In poche parole bisogna inserire lo "\n" per andare a capo in un file?
Stessa cosa se gli passo una stringa es:

FILE *f;
char stringa[100]; 
....
fprintf(f,"%s",stringa);
....


????

Risposte
apatriarca
Se vuoi andare a capo devi necessariamente inserire '\n', ma nel caso delle stringhe questo carattere di a capo potrebbe già essere presente al suo interno. La prima domanda non l'ho capita.. Immagino tu possa richiedere l'immissione della stringa da tastiera o usare una costante. Ma a parte il metodo in cui ottieni la stringa non ci sono molte differenze rispetto a quello che hai scritto.

claudio862
Nella maggior parte degli IDE puoi specificare gli argomenti da linea di comando con cui far partire il programma. Quindi puoi usare il debugger anche con questo metodo.

apatriarca
@CriDDJ: Avevi disabilitato i tag BBCODE e quindi non mostrava correttamente i codici.. Immagino avessi attivato l'opzione per sbaglio..

cristian.migotto
Ah ok, con la prima domanda Intendevo come posso aprire un file dalla fopen se so il percorso del file?
in modo da evitare il passaggio da cmd con gli argomenti....

"apatriarca":
@CriDDJ: Avevi disabilitato i tag BBCODE e quindi non mostrava correttamente i codici.. Immagino avessi attivato l'opzione per sbaglio..


Si per sbaglio... il mio intento era attivarli xD

"claudio86":
Nella maggior parte degli IDE puoi specificare gli argomenti da linea di comando con cui far partire il programma. Quindi puoi usare il debugger anche con questo metodo.


Io uso code:blocks per programmare come posso fare?

vict85
project -> Set programs' arguments

cristian.migotto
Devo inserire anche il nome del programma, o è automatico come primo argomento?

vict85
Non l'ho mai provato ma penso proprio che sia automatico dato che se non scrivi nulla il programma si esegue senza argomenti.

cristian.migotto
Ok provo appena posso, tanto mi serve, e posto qui ;)

cristian.migotto
Ho provato, ho settato:
molo.txt banane
Per il seguente programma che da linea di comando funziona:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc, char *argv[])
{
    const int MAX=100;
    const int MAXC=20;
    typedef struct {
                    int g, m, a;
            } data;

    data d, d_u={0,0,0};
    FILE *f;
    char riga[MAX+1];
    char merce_f[MAXC+1], merce_i[MAXC+1];
    int r=0;
    int n=0;
    int peso;
    int peso_tot=0.;

    if (argc != 2) {
        fprintf (stderr, "errore - introdurre nome file\n");
        exit (1);
    }
    if ((f=fopen(argv[1],"r")) == NULL) {
        fprintf (stderr, "errore - impossibile aprire il file %s in lettura\n", argv[1]);
        exit (1);
    }
    printf("Inserire il nome della merce: ");
    scanf("%s", merce_i);
    while (fgets(riga, MAX, f) != NULL) {
        r++;
        if (sscanf( riga, "%s %2d %*c %2d %*c %4d %d", merce_f, &d.g, &d.m, &d.a, &peso ) != 5)
            fprintf(stderr, "riga %d in formato errato - ignorata\n", r) ;
        else if(strcmp(merce_f, merce_i)==0 && peso>0){
                n++;
                peso_tot += peso;
                if((d.a>d_u.a)||((d.a==d_u.a)&&(d.m>d_u.m))||((d.a==d_u.a)&& (d.m==d_u.m) && (d.g>d_u.g)))
                    d_u = d;
        }
    }
    fclose(f);
    printf("Quintali totali caricati di %s: %.2f\n", merce_i, (float)peso_tot/100);
    printf("Data ultimo carico: %02d-%02d-%d\n", d_u.g, d_u.m, d_u.a);
    printf("Guadagno totale carico %s: Euro %.2f\n", merce_i, 10*n+0.1*peso_tot);
    return 0;
}

Pero mi da l'errore al file, quindi non riceve gli argomenti...

vict85
Errore trovato. Visualizzi l'errore nel caso argc != 2 ma i tuoi settaggi sono con argc = 3!

argv[0] è il nome del programma. Infatti a me ha funzionato mettendo solo il nome del file (in realtà preceduto da ../ ma dipende un po' da dove si trova il file).

Non hai affatto gestito il caso in cui tu abbia 2 argomenti.

cristian.migotto
A ecco devo mettere il percorso pensavo usasse la directory del programma!
Adesso riprovo!

vict85
Se si trova nella stessa cartella dell'eseguibile non è necessario.

cristian.migotto
Si ora funziona :) mi sono dimenticato che chiedevo poi di inserire la merce....
Comunque ho provato a fare un altro esercizio per gli argomenti ecco:
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv)
{
    int R=0;
    float D=0;
    char ch;
    if(argc!=4)
    {
        fprintf(stderr,"Errore negli argomenti!");
        return 1;
    }
    ch=argv[3];
    switch(ch){
    case 'a':
{
    R=((atoi(argv[1]))+(atoi(argv[2])));
       printf("%d",R);
       return 0;
    }

   case 'b':{
        R=((atoi(argv[1]))-atoi(argv[2]));
        printf("%d",R);
        return 0;
    }

case 'c':
    {
        R=((atoi(argv[1]))*atoi(argv[2]));
        printf("%d",R);
        return 0;
    }
case 'd':
    {
        if((atoi(argv[2]))!=0)
    {
        R=(atoi(argv[1])/atoi(argv[2]));
            printf("%.3f",D);
            return 0;
        }

        else printf("errore");
            return 1;
        }
default:
    {
        printf("Errore argomeniti");
        return 1;
    }

}


    return 0;
}

Solo che non capisco dove sia l'errore, eseguendo mi salta tutto lo switch...
Perché non assegna a ch il valore di argv[3] a cui io assegno una lettera...

cristian.migotto
"vict85":
Se si trova nella stessa cartella dell'eseguibile non è necessario.

Ah ecco io l'avevo messo nel progetto invece doveva essere proprio dove vi è il programma, grazie ancora!
Edit: ops scusate il doppio post.


Edit2
Ho provato a modificare due linee di codice come segue:
int main(int argc,char **argv)
...
ch=argv[3][0];

E adesso va.
Però non capisco perché prima non andava...
Che differenza c'è tra il doppio "*" e l'"*"?
E perché se non metto il doppio "*"non posso considerare l'argomento come una matrice di caratteri?

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.