ファイル記述子を備えたコードの問題。 C(Linux)
-
01-10-2019 - |
質問
1つのドキュメントからデータを取得し、暗号化して別のドキュメントに保存するコードを作成しました。
しかし、コードを実行しようとすると、暗号化されたデータが新しいファイルに配置されません。空白のままにします。誰かがコードに欠けているものを見つけてください。私は試しましたが、私はそれを理解することができませんでした。
読み取り/書き込み関数に何か問題があると思います。または、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);
}
解決
// Here...
fstat(fd, &fs);
// And here...
n=read(fd, buf, 10);
for(i=0;i<n;i++)
buf[i] ^= '#';
write(fd, buf, n);
あなたは読んで書いています fd
それ以外の fdin
と fdout
. 。コンパイラが発するすべての警告を有効にすることを確認してください(例:使用する gcc -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];
他のヒント
FSTATでFDINの代わりにFDを使用し、システムコールの読み取りと書き込みを使用しています。 FDは、初期化されていない変数です。
すべてが本当だと言った、もう一つのヒント。
システムハードディスクブロック、通常は8192に適合する大きなバッファーを使用する必要があります。これにより、800倍のディスクへのアクセスが少なくなると、プログラムの速度が大幅に向上します。ご存知のように、ディスクへのアクセスは非常に高価です時間条件。
もう1つのオプションは、stdio関数フリード、fwriteなどを使用することです。これは、すでにバッファリングの世話をしていますが、関数呼び出しのオーバーヘッドがあります。ロニ