在.c中将文件写入另一个文件

我有一个代码读取文件,然后将其内容复制到另一个文件。 我需要让它只复制每20个符号,然后跳过10个符号,然后再20个符号等等。

我不得不使用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); } 

更换

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

 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; } } 

如果BUFSIZ是20。

或者最简单,BUFSIZ = 30:

 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; } } 

另外考虑一个选择。 在你的问题的评论中提到了一些好点。 下面的例子收集了各种意见,并提供了一个简洁的方式来读取30个字节,并将第一个20字节写入输出文件。

避免使用全部幻数 (硬编码值遍及整个代码)。 读取和写入都被验证,流操作(例如freadfwrite )被用来代替readwrite )并且输出文件的close被验证:

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

注意 :只有20个字节的完整块被写入,如果最后一个读取是小于20个字节的部分读取,那么这个信息不会被写入输出文件,你可以调整freadfwrite周围的条件来定制行为到你的需求。)

示例输入文件(非POSIX,无eol)

下面的输入文件是文本的例子,ant不包含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 

如果您有任何问题,请查看并告诉我。

写入所有字节(0 <部分字节<= WRTSZ)

如果你想写最后一个fread读取的任何部分字节,你可以调整条件为类似于以下内容:

 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);