Pregunta

He código que idealmente debe tener en datos de un documento, cifrar y guardarlo en otro documento escrito.

Pero cuando trato de ejecutar el código que no pone los datos cifrados en el nuevo archivo. Simplemente deja en blanco. Alguien por favor detectar lo que falta en el código. Lo intenté, pero no pude entenderlo.

Creo que hay algo mal con la función de lectura / escritura, o tal vez estoy poniendo en práctica el do-while incorrectamente.

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


int main (int argc, char* argv[]) 
{
    int fdin,fdout,n,i,fd;
    char* buf;
    struct stat fs;

    if(argc<3)
        printf("USAGE: %s source-file target-file.\n",argv[0]);

    fdin=open(argv[1], O_RDONLY);
    if(fdin==-1)
        printf("ERROR: Cannot open %s.\n",argv[1]);

    fdout=open(argv[2], O_WRONLY | O_CREAT | O_EXCL, 0644);
    if(fdout==-1)
        printf("ERROR: %s already exists.\n",argv[2]);

    fstat(fd, &fs);
    n= fs.st_size;
    buf=malloc(n);

    do
    {
        n=read(fd, buf, 10);

        for(i=0;i<n;i++)
            buf[i] ^= '#';

        write(fd, buf, n);
    } while(n==10);

    close(fdin);
    close(fdout);
}
¿Fue útil?

Solución

// Here...
fstat(fd, &fs);

// And here...
n=read(fd, buf, 10);

for(i=0;i<n;i++)
    buf[i] ^= '#';

write(fd, buf, n);

Esta lectura y la escritura a fd en lugar de fdin y fdout. Asegúrese de habilitar todas las advertencias de su compilador emitirá (por ejemplo, el uso gcc -Wall -Wextra -pedantic). Se le advertirá sobre el uso de una variable sin inicializar si se lo permites.

Los errores también, si marcó los códigos de retorno de fstat(), read() o write(), que le han de haber recibido de utilizar un descriptor de archivo no válido. Lo más probable es erroring con EINVAL (argumento no válido) errores.

fstat(fd, &fs);
n= fs.st_size;
buf=malloc(n);

Y ya que estamos aquí: asignar suficiente memoria para almacenar el archivo completo es innecesaria. Sólo se está leyendo 10 bytes a la vez en su bucle, por lo que sólo se necesita un buffer de 10 bytes. Se podía saltar el fstat() por completo.

// Just allocate 10 bytes.
buf = malloc(10);

// Or heck, skip the malloc() too! Change "char *buf" to:
char buf[10];

Otros consejos

Está utilizando fd en lugar de fdin en fstat, leer y escribir las llamadas al sistema. fd es una variable no inicializada.

Todo dicho cierto, uno más punta.

Se debe utilizar un buffer más grande que se ajuste a los bloques de disco duro del sistema, por lo general 8192. Esto aumentará la velocidad de su programa de manera significativa ya que tendrá menos acceso al disco por un factor de 800. Como saben, el acceso al disco es muy costosa en términos de tiempo.

Otra opción es utilizar las funciones stdio fread, fwrite, etc, que ya se encarga de almacenamiento temporal, todavía tendrá la sobrecarga llamada a la función. Roni

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top