Domanda

Ho scritto il codice che idealmente dovrebbe prendere nei dati da un documento, cifrare e salvarlo in un altro documento.

Ma quando provo ad eseguire il codice non mettere i dati crittografati nel nuovo file. Si lascia solo in bianco. Qualcuno per favore individuare ciò che manca nel codice. Ho provato, ma non riuscivo a capirlo.

Penso che ci sia qualcosa di sbagliato con la funzione di lettura / scrittura, o forse sto attuazione del do-while in modo non corretto.

#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);
}
È stato utile?

Soluzione

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

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

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

write(fd, buf, n);

si sta leggendo e scrivendo a fd invece di fdin e fdout. Assicurati di attivare tutte le avvertenze il compilatore emetterà (ad esempio l'uso gcc -Wall -Wextra -pedantic). Essa vi avvertirà circa l'uso di una variabile non inizializzata se lo lasciate.

errori Inoltre, se hai controllato i codici di ritorno di fstat(), read() o write(), si sarebbe probabilmente hanno ottenuto da utilizzando un descrittore di file non valido. Essi sono molto probabilmente erroring con EINVAL (argomento non valido) errori.

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

E visto che siamo qui: l'allocazione di memoria sufficiente per contenere l'intero file non è necessaria. Stai leggendo solo 10 byte alla volta nel vostro ciclo, quindi è davvero solo bisogno di un buffer di 10 byte. Si potrebbe saltare il fstat() del tutto.

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

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

Altri suggerimenti

Si utilizza fd invece di fdin in fstat, leggere e chiamate di sistema di scrittura. fd è una variabile non inizializzata.

Tutto ha detto che vero, ancora una punta.

È necessario utilizzare un buffer più grande che si adatta il sistema blocchi del disco rigido, di solito 8192. Ciò consentirà di aumentare la velocità del programma in modo significativo, come si avrà un minore accesso al disco di un fattore 800. Come sapete, l'accesso al disco è molto costoso in termini di tempo.

Un'altra opzione è utilizzare le funzioni stdio fread, fwrite, ecc, che prende già cura di buffering, ancora avrete l'overhead chiamata di funzione. Roni

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top