Dependiendo de los argumentos de la línea de comandos, estoy configurando un puntero de archivo para apuntar hacia un archivo o stdin especificado (para el propósito de la canalización). Luego paso este puntero a una serie de funciones diferentes para leer del archivo. Esta es la función para obtener el puntero del archivo:Usando fseek con un puntero de archivo que apunta a stdin
FILE *getFile(int argc, char *argv[]) {
FILE *myFile = NULL;
if (argc == 2) {
myFile = fopen(argv[1], "r");
if (myFile == NULL)
fprintf(stderr, "File \"%s\" not found\n", argv[1]);
}
else
myFile = stdin;
return myFile;
}
Cuando se está apuntando a la entrada estándar, no parece trabajar fseek
. Con eso, quiero decir que lo uso y luego uso fgetc
y obtengo resultados inesperados. ¿Este es el comportamiento esperado? De ser así, ¿cómo me muevo a diferentes ubicaciones en la transmisión?
Por ejemplo:
int main(int argc, char *argv[]) {
FILE *myFile = getFile(argc, argv); // assume pointer is set to stdin
int x = fgetc(myFile); // expected result
int y = fgetc(myFile); // expected result
int z = fgetc(myFile); // expected result
int foo = bar(myFile); // unexpected result
return 0;
}
int bar(FILE *myFile) {
fseek(myFile, 4, 0);
return fgetc(myFile);
}
su código de ejemplo se ve bien para mí. (excepto cuando el archivo no existe, pero esto no está relacionado con su problema) –
me parece correcto. ¿Qué compilador es? puede tratar de imprimir, dentro de la barra() funcionan ambos punteros (stdin y myFile) para comprobar que son los mismos. – leonbloy
@leonbloy: He descubierto que el problema es en realidad con 'fseek()'. Aparentemente, ¿no funciona cuando el puntero apunta a stdin? Tiene alguna idea sobre esto? (Actualizado la pregunta) –