2009-11-17 23 views
6

He estado tratando de abrir un archivo y un texto de salida, pero sigo recibiendo errores. Así que pensé que comenzaría desde el principio y solo intentaría abrir el archivo. Este es mi código:No se puede abrir un archivo 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); 
} 

Cuando ejecuto el archivo, "Error" se imprime en la consola y eso es todo. TestFile1.txt está en la misma ubicación que mi .exe. ¿Cómo puedo solucionar esto?

Respuesta

3

El directorio de trabajo de su ejecutable probablemente está configurado de manera diferente al directorio donde está guardado. Verifica tu configuración IDE.

+0

Yep. Por ejemplo, [Visual Studio] (http://en.wikipedia.org/wiki/Microsoft_Visual_Studio) puede establecer el directorio actual donde está el archivo de solución (.sln) mientras que el archivo EXE puede estar abajo en la carpeta "Depurar". –

10

¿Cómo está ejecutando el archivo? ¿Es de la línea de comando o de un IDE? El directorio en el que se encuentra su ejecutable no es necesariamente su directorio de trabajo.

Intente utilizar el nombre completo de ruta en el fopen y vea si eso lo soluciona. Si es así, entonces el problema es como se describe.

Por ejemplo:

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

o abrir una ventana de comandos y vaya al directorio donde el ejecutable es, a continuación, ejecutar de forma manual.

Como acotación al margen, puede insertar un simple (para Windows o Linux/Unix/BSD/etc respectivamente):.

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

antes de la fopen para mostrar qué directorio que está realmente en

+2

No hay necesidad de barras diagonales inversas, que a menudo conducen a errores sutiles por parte de personas que tienen problemas para hacer funcionar cosas como 'fopen()'. Debe recomendar barras diagonales. –

+2

No recomiendo las barras hacia adelante ni hacia atrás, ya que la norma no exige el formato del nombre del archivo. Pero te estás perdiendo el punto si bajaste la votación por ese motivo, la intención era solo demostrar el uso de una ruta de archivo completa. – paxdiablo

+0

Podría ver lo siguiente: 'FILE * pFile = NULL; \t const char * filename = "E: /CODE/TEST/test.txt"; \t pFile = fopen (nombre de archivo, "r"); 'y dime qué me falta o qué hago mal. También probé: 'const char * filename =" E: \\ CODE \\ TEST \\ test.txt ";'. Nada parece funcionar. El programa se ejecuta pero no imprime nada en 'cmd'. Muestra la siguiente advertencia: 'Advertencia advertencia C4133: 'función': tipos incompatibles - de 'FILE *' a 'const char *'. IDE: VS 2013. – barnes

0

El directorio de la carpeta de salida debe haberse configurado en algún otro directorio en IDE. O puede cambiar eso o reemplazar el nombre de archivo con la ruta de archivo completa.

Espero que esto ayude.

+0

Excelentes comentarios. Ahora puedo abrir mi archivo al menos manualmente de esta manera. ¿Cómo lo haría desde la línea de comando en Visual Studio? Intenté esto en XCode agregando parámetros, pero simplemente no funcionaba para mí. Esperaba que Visual Studio me diera más suerte. ¡Gracias! – jet

+0

XCode y Visual Studio pueden establecer diferentes directorios de trabajo, pero el problema es el mismo, al igual que la solución. Debe incluir código en su aplicación que cambie al directorio que desee. – wadesworld

5

Una pequeña comprobación de errores puede ser de gran ayuda: siempre puede probar el valor de errno o llamar a perror() o strerror() para obtener más información sobre por qué falló la llamada fopen().

De lo contrario, las sugerencias sobre cómo verificar la ruta son probablemente correctas ... lo más probable es que no esté en el directorio que cree que es del IDE y no tiene los permisos que espera.

20

En lugar de printf("Error");, debe intentar perror("Error") que puede imprimir el motivo real de la falla (como el Problema de permiso, el Argumento inválido, etc.).

+10

Si encuentra 'perror' no lo suficientemente flexible, también puede usar' printf ("Error:% d (% s) \ n", errno, strerror (errno)) 'o incluso' printf ("Error:% m \ n ")' (una extensión Glibc). – ephemient

3

Bueno, ahora usted sabe que hay un problema, el siguiente paso es averiguar qué es exactamente el error, lo que sucede cuando se compila y ejecuta esto ?:

#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

Además de lo anterior, puede interesarle mostrar su directorio actual:

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

Esto debería funcionar sin problemas en una plataforma gcc/glibc. (Estoy más familiarizado con ese tipo de plataforma). Hubo una pregunta posted here que hablaba de getcwd & Visual Studio si se encuentra en una plataforma de tipo Windows.

1

Intente utilizar una ruta de acceso absoluta para el nombre de archivo.Y si está usando Windows, use getlasterror() para ver el mensaje de error real.

Cuestiones relacionadas