2009-11-17 8 views
6

Ho cercato di aprire un file e di inviare del testo, ma continuo a ricevere errori. Quindi ho pensato di iniziare dall'inizio e provare semplicemente ad aprire il file. Questo è il mio codice:Impossibile aprire un file con fopen()

#include <stdio.h> 
#include <stdlib.h> 
#define CORRECT_PARAMETERS 3 

int main(void) 
{ 
    FILE *file; 
    file = fopen("TestFile1.txt", "r"); 
    if (file == NULL) { 
     printf("Error"); 
    } 
    fclose(file); 
} 

Quando eseguo il file, "Errore" viene stampato sulla console e il gioco è fatto. TestFile1.txt si trova nella stessa posizione del mio exe. Come posso risolvere questo?

risposta

3

La directory di lavoro del tuo eseguibile è probabilmente impostata su qualcosa di diverso dalla directory in cui è stata salvata. Controlla le tue impostazioni IDE.

+0

Sì. Ad esempio, [Visual Studio] (http://en.wikipedia.org/wiki/Microsoft_Visual_Studio) può impostare la directory corrente su dove si trova il file della soluzione (.sln) mentre il file EXE potrebbe trovarsi nella cartella "Debug". –

10

Come si esegue il file? Proviene dalla riga di comando o da un IDE? La directory in cui si trova il tuo eseguibile non è necessariamente la tua directory di lavoro.

Provare a utilizzare il nome completo del percorso nello fopen e verificare se questo lo risolve. Se è così, allora il problema è come descritto.

Ad esempio:

file = fopen("c:\\MyDirectory\\TestFile1.txt", "r"); 
file = fopen("/full/path/to/TestFile1.txt", "r"); 

O aprire una finestra di comando e passare alla directory in cui l'eseguibile viene, quindi eseguirlo manualmente.

Per inciso, è possibile inserire una semplice (per Windows o Linux/UNIX/BSD/etc rispettivamente):.

system ("cd") 
system("pwd") 

prima della fopen per mostrare quale directory si sta effettivamente in

+2

Non c'è bisogno di backslash, che spesso portano a errori sottili da parte di persone che hanno problemi nel far funzionare 'fopen()'. Dovresti raccomandare le barre in avanti. –

+2

Non consiglio né le barre avanti o indietro poiché lo standard non richiede affatto il formato del nome file. Ma ti manca il punto se hai downvoted per quel motivo - l'intento era solo quello di dimostrare l'uso di un percorso completo del file. – paxdiablo

+0

Potresti dare un'occhiata a quanto segue: 'FILE * pFile = NULL; \t const char * filename = "E: /CODE/TEST/test.txt"; \t pFile = fopen (nome file, "r"); 'e dimmi cosa mi manca o cosa non funziona. Ho anche provato: 'const char * filename =" E: \\ CODE \\ TEST \\ test.txt ";'. Niente sembra funzionare. Il programma viene eseguito ma non stampa nulla su 'cmd'. Viene visualizzato il seguente avviso: 'Avviso \t Avviso 1 \t C4133: 'funzione': tipi incompatibili - da 'FILE *' a 'const char *'. IDE: VS 2013. – barnes

0

La directory della cartella di output deve essere stata configurata su un'altra directory in IDE. Puoi cambiarlo o sostituire il nome del file con l'intero percorso del file.

Spero che questo aiuti.

+0

Grandi commenti. Ora sono in grado di aprire il mio file almeno manualmente in questo modo. Come lo farei dalla riga di comando in Visual Studio? Ho provato questo su XCode aggiungendo parametri, ma non funzionava per me. Speravo che Visual Studio mi avrebbe dato più fortuna. Grazie! – jet

+0

XCode e Visual Studio potrebbero impostare diverse directory di lavoro, ma il problema è lo stesso, così come la soluzione. È necessario includere il codice nell'applicazione che cambia nella directory desiderata. – wadesworld

5

Un piccolo controllo degli errori è molto lungo: è sempre possibile verificare il valore di errno o chiamare perror() o strerror() per ottenere ulteriori informazioni sul perché la chiamata fopen() non è riuscita.

Altrimenti i suggerimenti sul controllo del percorso sono probabilmente corretti ... molto probabilmente non ci si trova nella directory che si pensa di essere dall'IDE e non si dispone delle autorizzazioni che ci si aspetta.

20

Invece di printf("Error");, si dovrebbe provare perror("Error") che può stampare il vero motivo di errore (come problema di autorizzazione, argomento non valido, ecc.).

+10

Se trovi 'perror' non abbastanza flessibile, puoi anche usare' printf ("Errore:% d (% s) \ n", errno, strerror (errno)) 'o anche' printf ("Errore:% m \ n ")' (un'estensione di Glibc). – ephemient

3

Bene, ora si sa che c'è un problema, il passo successivo è quello di capire che cosa esattamente l'errore è, ciò che accade quando si compila e si esegue questo ?:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    FILE *file; 
    file = fopen("TestFile1.txt", "r"); 
    if (file == NULL) { 
     perror("Error"); 
    } else { 
     fclose(file); 
    } 
} 
0

In aggiunta a quanto sopra, potresti essere interessato a visualizzare la tua directory corrente:

int MAX_PATH_LENGTH = 80; 
char* path[MAX_PATH_LENGTH]; 
getcwd(path, MAX_PATH_LENGTH); 
printf("Current Directory = %s", path); 

Questo dovrebbe funzionare senza problemi su una piattaforma gcc/glibc. (Sono più familiare con quel tipo di piattaforma). C'era una domanda posted here che parlava di getcwd & Visual Studio se si è su una piattaforma di tipo Windows.

1

Provare a utilizzare un percorso assoluto per il nome file.E se stai usando Windows, usa getlasterror() per vedere il messaggio di errore effettivo.