0

理想的には、あるドキュメントからデータを取り込み、それを暗号化し、別のドキュメントに保存するコードを作成しました。

しかし、コードを実行しようとすると、暗号化されたデータが新しいファイルに入れられません。空白のままにするだけです。誰かがコードに欠けているものを見つけてください。やってみたけどわからなかった。

読み取り/書き込み機能に何か問題があると思います。または、do-while ループを正しく実装していない可能性があります。

#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);
}
4

3 に答える 3

3

fstat、read および write システム コールで fdin の代わりに fd を使用しています。fd は初期化されていない変数です。

于 2010-09-05T18:39:35.110 に答える
2
// Here...
fstat(fd, &fs);

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

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

write(fd, buf, n);

fdの代わりに読み書きしています。コンパイラが発行するすべての警告を有効にしてください (例: use )。許可すると、初期化されていない変数の使用について警告されます。fdinfdoutgcc -Wall -Wextra -pedantic

fstat()また、 、read()、またはのリターン コードを確認するとwrite()、無効なファイル記述子を使用してエラーが発生した可能性があります。ほとんどの場合、EINVAL (無効な引数) エラーでエラーが発生しています。

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

ここにいるので、ファイル全体を保持するのに十分なメモリを割り当てる必要はありません。ループ内で一度に 10 バイトしか読み取っていないため、実際には 10 バイトのバッファーのみが必要です。fstat()完全にスキップできます。

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

// Or heck, skip the malloc() too! Change "char *buf" to:
char buf[10];
于 2010-09-05T18:40:45.793 に答える
0

すべてが本当だと言いましたが、もう 1 つのヒントです。

通常は 8192 のシステム ハードディスク ブロックに適合する大きなバッファを使用する必要があります。これにより、ディスクへのアクセスが 800 分の 1 になるため、プログラムの速度が大幅に向上します。時間の条件。

もう 1 つのオプションは、標準入出力関数 fread、fwrite などを使用することです。これは既にバッファリングを処理しますが、それでも関数呼び出しのオーバーヘッドが発生します。ロニ

于 2010-09-05T21:19:44.747 に答える