File errore in esecuzione - Debug funzionante

di il
4 risposte

File errore in esecuzione - Debug funzionante

Buonasera a tutti.
Stavo testando un progetto piuttosto complesso che devo inviare, per cui facevo vari tentativi anche per controllarne la portabilità, e mi si è presentato un problema, la cui causa è al di fuori della mia esperienza, di studente. Quello che mi è successo è che facendo il Debug dall'IDE (Utilizzo Codebloks) tutto ok, avviando l'esecuzione dall'IDE.. tutto ok, poi se invece provo ad aprire direttamente il file eseguibile generato dalla compilazione del codice, qualcosa non va a buon fine.. E non va a buon fine l'apertura di un file.txt, che è come se non mi trovasse in quanto verifico che la fopen ritorna NULL.

Ho cercato di scrivere un breve codice in cui si presente la stessa situazione (main.c) all'interno di un progetto chiamato "prova" e nella stessa cartella ho messo un file data.txt il cui contenuto è "CIAO!"
main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    FILE *file;
    char *string=malloc(sizeof(char)*30);
    char c;

    file=fopen("data.txt","r");

    c=fgetc(file);
    sprintf(string, "%c", c);
    while ((c=fgetc(file)) != EOF)
            sprintf(string, "%s%c", string,c);

    printf("CONTENUTO FILE: %s\n",string);
    system("PAUSE");
    return 0;
}
L'esecuzione di questo piccolo codice mi ritorna "CONTENUTO FILE: CIAO!", mentre se apro l'eseguibile prova.exe ottengo "CONTENUTO FILE: ".
La mia domanda è.. come mai accade questo nonostante il file di testo sia all'interno della stessa cartella del progetto? Per questo motivo ho creduto non possa essere il percorso del file il problema, ma non so. Chiedo aiuto a voi, più esperti.
Grazie!

4 Risposte

  • Re: File errore in esecuzione - Debug funzionante

    Ma il file sta nella stessa cartella dell'eseguibile quando lanci l'exe?
  • Re: File errore in esecuzione - Debug funzionante

    oregon ha scritto:


    Ma il file sta nella stessa cartella dell'eseguibile quando lanci l'exe?
    No!! Praticamente Codeblocks crea in automatico delle sottocartelle dove mette l'eseguibile quindi io lo eseguivo direttamente da lì senza pensarci, spostandolo in cartella principale funziona tutto ovviamente!! Grazie mille
  • Re: File errore in esecuzione - Debug funzionante

    per cui facevo vari tentativi anche per controllarne la portabilità
    Scusa, però, prima di iniziare a fare controlli di portabilità a tappeto dovresti rendere il tuo codice un po' più affidabile, perchè anche se funziona in una particolare situazione riproducibile, non vuol dire che sia corretto.
    Questo è quello che vedo io:
    1) non testi se la malloc() ha avuto successo: peccato veniale, visto che allochi solo 30 byte, ma dato che i 30 byte sono fissi, e quindi non c'è niente di dinamico, non era meglio definire un array di 30 char?
    2) non testi se la fopen() ha avuto successo: questo è grave e giustamente ti ha fatto perdere del tempo prezioso quando hai testato il programma
    3) per caricare string non c'è bisogno di scomodare una sprintf(), basta accedere ai singoli elementi, es.: string=c; (naturalmente alla fine devi ricordarti di terminare la stringa, con string=0;)
    4) cosa succede se il file contiene più di 30 caratteri? Nel while vai avanti finchè ci sono caratteri nel file e non controlli lo sforamento di string; se segui il suggerimento del punto 3) la cosa dovrebbe essere semplice da implementare...
    Ciao e buono studio
  • Re: File errore in esecuzione - Debug funzionante

    candaluar ha scritto:


    per cui facevo vari tentativi anche per controllarne la portabilità
    Scusa, però, prima di iniziare a fare controlli di portabilità a tappeto dovresti rendere il tuo codice un po' più affidabile, perchè anche se funziona in una particolare situazione riproducibile, non vuol dire che sia corretto.
    Questo è quello che vedo io:
    1) non testi se la malloc() ha avuto successo: peccato veniale, visto che allochi solo 30 byte, ma dato che i 30 byte sono fissi, e quindi non c'è niente di dinamico, non era meglio definire un array di 30 char?
    2) non testi se la fopen() ha avuto successo: questo è grave e giustamente ti ha fatto perdere del tempo prezioso quando hai testato il programma
    3) per caricare string non c'è bisogno di scomodare una sprintf(), basta accedere ai singoli elementi, es.: string=c; (naturalmente alla fine devi ricordarti di terminare la stringa, con string=0;)
    4) cosa succede se il file contiene più di 30 caratteri? Nel while vai avanti finchè ci sono caratteri nel file e non controlli lo sforamento di string; se segui il suggerimento del punto 3) la cosa dovrebbe essere semplice da implementare...
    Ciao e buono studio


    Grazie per i suggerimenti!
Devi accedere o registrarti per scrivere nel forum
4 risposte