2012-02-02 15 views
7

Estoy tratando de pasar una ruta relativa a fopen(), pero parece que no puede encontrar el archivo. Necesito esto para trabajar en Linux. Los nombres de archivo (por ejemplo, t1.txt) se guardan en una matriz. Entonces, todo lo que necesito es la "parte frontal" de una ruta relativa.Pasar una ruta relativa a fopen()

Aquí está mi código:

// Use strcat to create a relative file path 
char path[] = "./textfiles/"; // The "front part" of a relative path 
strcat(path, array[0]); // array[0] = t1.txt 

// Open the file 
FILE *in; 
in = fopen("path", " r "); 
if (!in1) 
{ 
    printf("Failed to open text file\n"); 
    exit(1); 
} 

Respuesta

6
in = fopen("path", " r "); 

Dos errores allí mismo:

  1. Usted no desea abrir el archivo llamado literalmente "camino", desea que el archivo cuyo nombre está en la variable path
  2. el argumento de modo no es válido; desea "r"

Para hacerlo bien hacer

in = fopen(path, "r"); 
+0

oh wow, jaja! nunca habría captado el primer error por mi cuenta. Y sí, me gusta agregar espacios para que el código no se vea saturado. ¡Adivina que es una mala idea! De todos modos, ¡gracias! – Dino55

+0

No olvide las sugerencias en las otras respuestas, específicamente el tamaño de la matriz 'path' y no pruebe' in1' cuando su 'FILE *' esté 'in'. – pmg

5

En primer lugar, es necesario agregar un poco de espacio a path con el fin de adaptarse al contenido de array[0] en strcat, de lo contrario estará escribiendo más allá de la zona asignada.

En segundo lugar, no está pasando path a fopen, porque encerró "path" entre comillas.

char path[100] = "./textfiles/"; // Added some space for array[0] 
strcat(path, array[0]); 

// Open the file 
FILE *in; 
in = fopen(path, " r "); // removed quotes around "path" 
if (!in) 
{ 
    printf("Failed to open text file\n"); 
    exit(1); 
} 
+0

Veo. ¡Gracias! – Dino55

+0

Creo que quisiste decir 'strcat (ruta, argv [1])', ya que 'argv [0]' es el nombre del programa actual. – markgz

+0

@markgz Gracias! En realidad, quise decir 'array [0]' para seguir el código del OP, pero intellisense puso argv, y no me di cuenta. Esto ahora está arreglado. – dasblinkenlight

2

Su problema no tiene nada que ver con fopen y todo con el manejo de cadenas C: strcat requiere suficiente memoria en el búfer de destino para toda la cadena, pero solo proporciona suficiente memoria para la cadena inicial . ¡Malo! El uso de herramientas como valgrind le informará acerca de su acceso ilegal de inmediato, por cierto.

he aquí una solución ingenua:

char buf[1000] = { }; 
strcat(buf, "./textfiles/"); 
strcat(buf, array[0]); 

// ... 
+0

¡Gracias! funciona ahora :) – Dino55

2

path es sólo lo suficientemente grande como para contener los caracteres se ha inicializado con. El tamaño de path debe aumentarse. Asignar memoria para path según el nombre del archivo adjunto:

const char* dir = "./textfiles/"; 
const size_t path_size = strlen(dir) + strlen(array[0]) + 1; 
char* path = malloc(path_size); 
if (path) 
{ 
    snprintf(path, path_size, "%s%s", dir, array[0]); 

    in = fopen(path, "r"): /* Slight differences to your invocation. */ 

    free(path); 
} 
+0

No pensé en eso en absoluto. ¡Gracias por la respuesta! – Dino55

Cuestiones relacionadas