Quiero imprimir el contenido de un archivo txt (primer parámetro), pero la función para hacerlo está en un archivo diferente. Tengo el siguiente archivo principal:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "fileoperation.h" int main(int argc, char **argv) { read(argv[1]); return 0; }y luego en el archivo fileoperation.c tengo:
#include "fileoperation.h" void read(char* file) { FILE *fptr; char c; fptr = fopen(file, "r"); if (fptr == NULL) { printf("Cannot open file \n"); exit(0); } c = fgetc(fptr); while (c != EOF) { printf ("%c", c); c = fgetc(fptr); } fclose(fptr); }Si escribo el código de la función en la función principal, funciona. no entiendo porque no funciona
El archivo de encabezado de fileoperation.c es
#ifndef FILEOPERATION_H #define FILEOPERATION_H #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> void read(char* file); #endifRenombra tu función. read existe en las bibliotecas de respaldo. Para empeorar las cosas, el compilador sabe lo que hace y lo optimiza.
Podría haber sido peor. Podría haber reemplazado la read real con la suya y ampliar las bibliotecas estándar.
Parece que está utilizando un compilador no estándar o lo ha configurado incorrectamente. Se sabe que los compiladores como gcc y clang invocan un comportamiento no compatible a menos que compile con -std=c17 -pedantic-errors (consulte ¿Qué opciones de compilador se recomiendan para los principiantes que aprenden C? ). No puedo reproducir el problema usando un compilador compatible con C.
Un compilador compatible no puede colocar identificadores no estándar en encabezados estándar que no sean los reservados explícitamente por el estándar C. Ejemplos de identificadores reservados son aquellos con dos guiones bajos iniciales, aquellos con un guión bajo inicial seguido de una letra mayúscula e identificadores reservados para futuras extensiones de idioma/biblioteca. Fuente: ISO 9899:2018 capítulos 4/6, 7.1.3, 6.11 y 7.31.
Los compiladores mencionados deben eliminar todas las declaraciones de identificadores no estándar al compilar en modo compatible con lenguaje C como se describe anteriormente. Si no es así, ha encontrado un error en la biblioteca del compilador.
Existe una función antigua, bien conocida (e increíblemente mal nombrada) read , pero nunca ha sido parte de la biblioteca estándar de C. (POSIX intentó estandarizarlo, pero eso es irrelevante aquí). Entonces, la solución fácil es simplemente no nombrar una read de identificador, no tanto porque una función no estándar bien conocida tenga ese nombre, sino porque es muy pobre y no -nombre identificador descriptivo. En tu caso, podrías haber usado read_file o similar.