Domanda PROBLEMA CON I FILE IN XCODE

  • Autore discussione Deleted member 287194
  • Data d'inizio
D

Deleted member 287194

Salve, io ho creato un file con TextEdit e l'ho rinominato file1.c, ho provato a chiamare il file in questione su Xcode ma mi esce sempre la dicitura IMPOSSIBILE, mi chiedo come mai e come risolvere il problema.
Rilascio il codice qui di seguito.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main (void)
{
FILE *fp;
fp = fopen ("file1.c", "r");
if (fp == NULL)
{
printf ("IMPOSSIBILE");
return 1;
}
fclose (fp);
return 0;
}
 
Non si capisce cosa stai cercando di ottenere, se la domanda è perché eseguendo quel codice viene stampato IMPOSSIBILE: è perché file1.c non è stato trovato oppure non è possibile leggerlo (permessi o altro).
 
Non si capisce cosa stai cercando di ottenere, se la domanda è perché eseguendo quel codice viene stampato IMPOSSIBILE: è perché file1.c non è stato trovato oppure non è possibile leggerlo (permessi o altro).
che vuol dire non si capisce cosa stai cercando di ottenere ahahah, semplicemente mi chiedo perché questo file non me lo riesce ad aprire e non solo questo, tutti gli altri
 
che vuol dire non si capisce cosa stai cercando di ottenere ahahah, semplicemente mi chiedo perché questo file non me lo riesce ad aprire e non solo questo, tutti gli altri

Non si capisce perché parli di XCode, di TextEdit, di C su MacOS mentre usi macro come _CRT_SECURE_NO_WARNINGS che sono per MSVC su Windows e perché leggere un file c a runtime non è comunissimo e sapere qual è il fine ultimo può essere utile a dare una risposta.

Di solito quando non si trova un file cercando per path relativo è perché stai eseguendo il programma in una working directory diversa da quella che contiene il file. Quindi puoi specificare il percorso completo, scrivere del codice per trovarlo a runtime oppure assicurarti che la cwd sia corretta. Se lo stai eseguendo in debug puoi usare Product -> Scheme -> Edit Scheme e Options dove puoi modificare la working directory per il debug e farla puntare alla cartella che contiene i file, mentre in release dovresti eseguirlo come cd /path/to/filec && /path/to/program/executable (cd path && ./executable se nella stessa cartella) se non vuoi aggiungere altro codice.

Per "scrivere del codice per trovarlo" intendo che se sai che questi file sono in una cartella ben precisa allora ci puoi arrivare, faccio un esempio brutto ma funzionante per i file nella stessa cartella del programma a prescindere della CWD (estrae il percorso del programma da argv[0] e va solo su sistemi unix-like con la slash come separatore):

C:
#include <stdio.h>
#include <string.h>

void get_program_dir_file(char* fullPath, const char* programPath, const char* name)
{
    strcpy(fullPath, programPath);
    char* p = strrchr(fullPath, '/');
    strcpy(++p, name);
}

int main(int argc, char* argv[])
{
    char fileName[250];
    FILE *fp;
    get_program_dir_file(fileName, argv[0], "file1.c");
    fp = fopen(fileName, "r");
    if (fp == NULL)
    {
        printf ("Impossibile aprire il file in lettura");
        return 1;
    }
    fclose(fp);
    return 0;
}
 
Per quanto riguarda la macro utilizzata non sapevo fosse esclusiva windows, il testo su cui mi riferisco non aveva fatto questo tipo di distinzione.
Io sono solo agli inizi quindi metà della roba che mi hai detto non l'ho capito, ti chiedo di essere un pò paziente con me.
Ho provato a scrivere il percorso del file al posto del nome ma comunque non mi era uscito niente.
 
Ultima modifica:
Prendi questo codice
C:
#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    char cwd[1024];
    if (getcwd(cwd, sizeof(cwd)) != NULL) {
        printf("The current working directory is: %s\n", cwd);
        printf("In respect of your working directory, the path of your executable is: %s\n", argv[0]);
    } else {
        perror("getcwd()");
    }

    const char *filename = "test.txt";
    FILE *fp = fopen(filename, "r");
    if (fp == NULL) {
        perror(filename);
        return 1;
    }

    printf("Looks good!\n");
    fclose(fp);
    return 0;
}

Quando lo esegui dovrebbe stamparti dei messaggi un po' più significativi. Per prima cosa dovrebbe stamparti la tua working directory e dove si trova l'eseguibile rispetto alla tua working directory. Crea un file chiamato "test.txt" all'interno della working directory stampata, poi prova a rieseguire il programma per vedere se te lo trova (i.e., se stampa "Looks good!"). Personalmente, ti consiglio anche di abituarti ad aprire il terminale e di far partire i tuoi programmi da lì: gli IDE si usano per programmare/debuggare, non per eseguire. Devi fare cd /percorso/del/tuo/eseguibile per cambiare working directory e poi ./nomefile per eseguire.

Se riesci a far funzionare questo codice, sarai anche in grado di capire qual è il problema nel tuo. Come ti ha spiegato JunkCoder, plausibilmente il tuo programma non riesce ad aprire "file1.c" perché quel file non si trova nella tua working directory. In caso non lo sai, la working directory sarebbe la cartella da cui stai lanciando il tuo eseguibile. Nota che non necessariamente è la cartella in cui è presente l'eseguibile perché, per esempio, puoi fare /percorso/del/tuo/eseguibile/nomefile per eseguire il tuo programma anche se sei fuori dalla cartella "eseguibile".

Se dovessi avere ancora problemi copia e incolla l'output, almeno anche noi capiamo qualcosa in più.
 
  • Grazie
Reazioni: JunkCoder
La pazienza va bene ma tu devi spiegare quello che stai facendo e che vorresti fare in modo da far capire a tutti.
Perché da un tuo programma vuoi aprire in lettura un file sorgente?
E questo file esiste?
Dove è posizionato?