0

私はファイルを開いてその内容を別のファイルに書き込むためにcでこのコードを持っていますが、それを実行すると間違った結果になり、一部の行はコピーされただけで無限ループに入ります:

#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>


//static int    read_cnt;
//static char   *read_ptr;
//static char   read_buf[1024];


int main(int argc, char **argv)
{
    //i have a variable size which is an int and is the byte size of the file
    //i got the byte size of file from stat
    int fileread = open("/tmp/des.py",'r');
    char buffer[1024];



    while((fileread = read(fileread, buffer, sizeof(buffer))>0));
    {
        if(fileread < 0) 
              printf("error write");
    }


    int filewrite = open("/tmp/original.txt", O_WRONLY|O_CREAT);

    while ((filewrite = write(filewrite, buffer, sizeof(buffer))>0))
    {
        if(filewrite < 0)
              printf("error write");
    }


    close(filewrite);
    close(fileread);

    return 0;
}

では、この問題を解決する方法

4

3 に答える 3

2

OP はコンテンツ全体をコピーしようとしましたが、2 つのばらばらな while ループがあります。1 つ目は、すべてのデータを同じ小さなバッファーに読み込みます。次に、バッファの最後の内容を使用して、そのバッファに無限に書き込みます。

while ループは 1 つだけ必要です。書き込みバッファは、 ではなく、読み取ったデータの長さを使用する必要がありますsizeof buffer

int fileread = open("/tmp/des.py", O_RDONLY);
int filewrite = open("/tmp/original.txt", O_WRONLY|O_CREAT);
// After successfully opening ...
char buffer[1024];
ssize_t inlen;
ssize_t outlen;
while((inlen = read(fileread, buffer, sizeof buffer)) > 0) {
  outlen = write(filewrite, buffer, inlen);  // Note use of inlen
  if (inlen != outlen) {
    handle_error();
  }
}
if (inlen < 0) {
  handle_error();
}
close(filewrite);
close(fileread);
于 2013-10-22T10:27:45.963 に答える
0

あなたが必要

size_t bytesRead = 0;
while((bytesRead=read(fileread,buffer,sizeof(buffer))>0));

read読み取られたシンボルの数を返すため、これが必要です。この場合、ファイルハンドルを上書きしただけです。

于 2013-10-22T09:05:19.140 に答える