Cómo leer un archivo binario y guardarlo dentro de una tubería

Usé el siguiente código para abrir un archivo binario fp (el archivo contiene una matriz 2D guardada) y colóquelo dentro de una tubería:

if ((fp=fopen("file", "rb"))==NULL) {
    printf("Cannot open file.\n");
}
if (fread(array, sizeof(int), 5*5, fp) != 5*5) {
    if (feof(fp))
        printf("Premature end of file.");
} else {
    printf("File read error fread.");
}

¿Es este el código para ponerlo dentro de la tubería?

close(fd[0]);
if ((ch=fgetc(fp))==EOF)
    write(fd[1], &ch, 1 );

Si quiero hacer una suma de la matriz, ¿cómo podría hacerlo?

preguntado el 09 de enero de 11 a las 12:01

Todavía está llamando a fread cuando falla la apertura del archivo. Debería volver después de los mensajes de error. -

@ phihag- no hay mensaje de error en este código -

@ Bobj-C, entonces, ¿cuál es el mensaje en la segunda línea? Me parece un mensaje de error. De todos modos, llamas a fread con fp incluso si fp es NULL, ¿no es así? -

el segundo mensaje no sé si es correcto porque esto lo pregunté -

@ Bobj-C: No, no preguntaste sobre esa parte del código (es decir, el mensaje en la segunda línea, ¡no el segundo mensaje!), Preguntaste cómo canalizar los datos y cómo sumar la matriz (qué ¿La matriz aguanta?). @phihag está tratando de señalar que está verificando una apertura fallida e informando, pero luego continúa usando el descriptor de archivo de todos modos. -

1 Respuestas

La forma más sensata de escribir la matriz en la tubería, siempre que el tamaño siga siendo pequeño, es hacer:

int nw = 5 * 5 * sizeof(int);
if (write(fd[1], array, nw) != nw)
    err_exit("Failed to write to pipe");

(Dónde err_exit() es una función que escribe un mensaje en el error estándar y sale (o no regresa).

Esto supone que su matriz es una matriz de 5x5 (un comentario de usted implica que es 10x2, en cuyo caso su código de lectura tiene problemas importantes). Asume que el tamaño del búfer en una tubería es lo suficientemente grande para contener los datos; si no es así, su llamada de escritura puede bloquearse. Se asume que hay en algún lugar un proceso para leer de la tubería; si este es el único proceso, el write() activará una señal SIGPIPE, matando su proceso, debido a la close(fd[0]);.

Es posible escribir un byte a la vez, no es estelar para el rendimiento.

Leyendo un byte a la vez desde fp después de haber leído los datos en array no es del todo sensato: en el mejor de los casos, está leyendo diferentes datos para escribir en la tubería.

La forma normal de sumar una matriz 2D es (C99):

enum { DIM_1 = 5, DIM_2 = 5 };
int array[DIM_1][DIM_2];

...data to load array...

int sum = 0;
for (int i = 0; i < DIM_1; i++)
{
    for (int j = 0; j < DIM_2; j++)
         sum += array[i][j];
}

No importa de dónde provengan los datos, siempre y cuando los haya inicializado.

Respondido el 09 de enero de 11 a las 19:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.