2016-04-14 15 views
0

ファイルを読み込んでその内容を別のファイルにコピーするコードがあります。私はそれを20個のシンボルごとにコピーし、次に10個のシンボルをスキップし、次に20個のシンボルをスキップするようにする必要があります。.cファイルを別のファイルに書き込む

私はlseek()関数を使用する必要がありますが、私はそれを行うサイクルのすべてをどのように置くべきかわかりません。

main (argc, argv) 
int argc; 
char *argv[]; 
{ 
    int fd1, fd2; 
    int nbytes, mode; 
    char buf[BUFSIZ]; 
    if(argc<3){ 
     fprintf(stderr, "%s: nepareizs kopesanas parametrs\n", argv[0]); 
     exit(1); 
    } 
    if((fd1 = open(argv[1], O_RDONLY)) < 0){ 
     fprintf(stderr, "Nevar atvert failu %s\n", argv[1]); 
     exit(1); 
    } 
    if((fd2 = open(argv[2], O_WRONLY | O_CREAT, mode))<0){ 
     fprintf(stderr, "Nevar izveidot jaunu failu %s\n", argv[2]); 
     exit(1); 
    } 

    nbytes = lseek(fd1, 10, 0) 
    while((nbytes = read(fd1, buf, BUFSIZ))>0){ 
      if(write(fd2, buf, nbytes) < 0){ 
       fprintf(stderr, "не понимаю\n"); 
       break; 

      } 

    } 

    if (nbytes<0) 
     fprintf(stderr, "не понимаю\n"); 
    close(fd1); 
    close(fd2); 
    exit(0); 
} 
+6

30バイトのチャンクで読み込みますが、最初の20バイトだけを使用します。 – Dummy00001

+1

なぜCの古いスタイルを使用していますか? – MikeCAT

+1

私の先生は古代だから。彼は赤軍でソ連のために戦ってきた。笑。 –

答えて

1

交換

nbytes = lseek(fd1, 10, 0) 
while((nbytes = read(fd1, buf, BUFSIZ))>0){ 
     if(write(fd2, buf, nbytes) < 0){ 
      fprintf(stderr, "не понимаю\n"); 
      break; 

     } 

} 

BUFSIZはBUFSIZで、最も単純な、= 30 20

であるか

while((nbytes = read(fd1, buf, BUFSIZ))>0){ 
     /* first you write your 20 bytes */ 
     if(write(fd2, buf, nbytes) < 0){ 
      fprintf(stderr, "не понимаю\n"); 
      break; 

     } 
     /* and then you move 10 bytes further */ 
     if (lseek(fd1, 10, 0) < 0){ 
      /* break if this is the eof */ 
      break; 
     } 

} 

場合と:

while((nbytes = read(fd1, buf, BUFSIZ))>0){ 
    /* you only write the first 20 read bytes, or nbytes 
     if there are no much bytes in the buffer */ 
    if(write(fd2, buf, nbytes < 20 ? nbytes : 20) < 0){ 
     fprintf(stderr, "не понимаю\n"); 
     break; 
    } 
} 
+0

'BUFSIZ 30'と' WRTSZ 20'を作って、2番目の 'if'ブロック全体と' write(fd2、buf、WRTSZ) '全体を削除してみませんか?簡単な解決策のように見え、 'lseek'呼び出しを完全に避けますか? –

+0

彼はシークを使いたいと思っていましたが、それはより良い解決策でなければなりません。 – Boiethios

0

考慮すべき追加の代替案。あなたの質問へのコメントには、いくつかの良い点が言及されています。以下の例では、さまざまなコメントを収集し、30バイトを読み込み、最初の20バイトを出力ファイルに書き込むための簡潔な方法を示します。

のマジックナンバー(コード全体にハードコードされた値を振りかざす)は使用しないでください。

#include <stdio.h> 

enum { WRTSZ = 20, BUFSZ = 30 }; 

int main (int argc, char **argv) { 

    if (argc < 3) { 
     fprintf (stderr, "error: insufficient input, usage: %s ifile ofile\n", 
       argv[0]); 
     return 1; 
    } 

    FILE *ifp = fopen (argv[1], "rb"); 
    FILE *ofp = fopen (argv[2], "w+"); 
    char buf[BUFSZ] = ""; 

    if (!ifp) { /* validate file open for reading (binary) */ 
     fprintf (stderr, "error: file open failed '%s'.\n", argv[1]); 
     return 1; 
    } 
    if (!ofp) { /* valdate file open for writing */ 
     fprintf (stderr, "error: file open failed '%s'.\n", argv[1]); 
     return 1; 
    } 
    /* read BUFSZ bytes (require at least WRTSZ), and output */ 
    while (fread (buf, sizeof *buf, BUFSZ, ifp) >= WRTSZ) 
     if (fwrite (buf, sizeof *buf, WRTSZ, ofp) != WRTSZ) 
      fprintf (stderr, "error: fwrite of WRTSZ failed.\n"); 

    fclose (ifp); 
    if (fclose (ofp)) /* validate close of output file */ 
     fprintf (stderr, "error: on close of '%s'.\n", argv[2]); 

    return 0; 
} 

:のみフルブロックの読み取りと書き込みの両方がストリーム操作(例えばfreadfwrite)が代わりにreadwriteの利用されている)と、出力ファイルのcloseが検証され、検証され最後の読み取りが20バイト未満の部分読み取りである場合、その情報は出力ファイルに書き込まれません。freadおよびfwriteを取り囲む条件を調整して、必要に応じて動作を調整できます)。

例入力ファイル(非POSIX、無EOL)

次の入力ファイルは、例示目的のためにテキストである、アリそれにはPOSIX 行末'\n')を含みません。

$ cat dat/ruler.txt 
........10........20........30........40........50........60........70........80........90 

使用/出力ファイル

$ ./bin/rd30wrt20 dat/ruler.txt dat/rulerout.txt 
$ cat dat/rulerout.txt 
........10........20........40........50........70........80 

はそれを上に見て、私を聞かせて(あなたが好きなら、それだけで、出力ファイルに書き込まれる改行になります改行を含めることができます)あなたは何か質問がある場合は知っている。

:あなたが最後 fread中に読み込ま任意の部分のバイトを書き込みたい場合は、次のようなものに条件文を調整することができますすべてのバイト(0 <部分バイト< = WRTSZ)

を書く

size_t rdsz; ... /* read BUFSZ bytes, write 0 < rdsz <= WRTSZ */ while ((rdsz = fread (buf, sizeof *buf, BUFSZ, ifp))) if (fwrite (buf, sizeof *buf, rdsz > WRTSZ ? WRTSZ : rdsz, ofp) != WRTSZ) fprintf (stderr, "warning: fwrite of '%zu'.\n", rdsz); 
関連する問題