Ayuda con la entrada / salida estandar desde ficheros

Oreades
14 de Mayo del 2004
Buenas. Estoy realizando unas practicas en C de Sistemas Operativos en Linux y tengo un problema. Intentamos programar un sistema para copiar archivos redireccionando la entrada y la salida estandar. Redirecciono los ficheros como entrada y salida estandar pero solo me funciona la salida. Es decir, solo he conseguido que la orden "putchar" escriba sobre el fichero de salida pero no he conseguido que "getchar" consiga leer desde el fichero. Si sirve de algo, pongo aqui el codigo:

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>

#define TAM_CADENA 256

int main(int argc, char** argv) {
// Descriptor del fichero de entrada y salida
int fe;
int fs;
// Para lecturas de caracteres
int ch;
char* cadena[TAM_CADENA];


// Abrimos el fichero de salida
fs=open("salida.txt", O_RDWR);
if (fs<0) {
printf("Error al abrir el fichero de salidan");
return(-1);
}

// Abrimos el fichero de entrada
fe=open("entrada.txt", O_RDONLY);
if (fe<0) {
printf("Error al abrir el fichero de entradan");
return(-1);
}

// Redireccionamos el fichero de entrada a la entrada estandar
if (dup2(fs, 0)<0) {
perror("Error al asignar la entrada estandarn");
return(-1);
}

// Redireccionamos el fichero de salida a la salida estandar
if (dup2(fs, 1)<0) {
perror("Error al asignar la salida estandarn");
return(-1);
}

ch = getchar(); /* Toma un caracter de la entrada estandar */
putchar((char)ch); /* Despliega el caracter en la salida estandar */

// Cerramos los ficheros
close(fe);
close(fs);
}

Soy un poco novato en el C y puede que el problema sea muy simple, pero es que no tengo la experiencia ni soltura suficiente en este lenguaje.

Gracias por la ayuda.

chuidiang
14 de Mayo del 2004
Lo estás haciendo de una forma un poco rara.

Abres dos ficheros, uno de entrada y otro de salida.

La función dup2() cierra el fichero que le pasas como segundo parámetro y reaprovecha el numero de descriptor para obtener una copia del primer parametro. Es decir, estás cerrando la stdin y la stdout y haces que los descriptores 1 y 2 lean y escriban en los ficheros "entrada.txt" y "salida.txt"
¿Es eso lo que quieres hacer?. Si es eso, se puede hacer más simple usando directamente fs y fe.

Si entrada.txt no tiene datos, no leeras nada de el.

No sé cómo es la práctica que intentas hacer, pero por redireccionar yo entiendo que tu programa lee de la stdin y escribe en la stdout. Luego hay que llamarlo asi

$ ./programa < cat entrada.txt > cat salida.txt

Se bueno.

zeros
14 de Mayo del 2004
Prova con fgetc(stdin); y fputc(stdout) es lo mas seguro
suerte.