Как записать в файл с помощью системного вызова чтения? а как определить размер буфера? - PullRequest
0 голосов
/ 05 мая 2020

Я пишу код, который читает из файла и записывает в другой файл, у меня проблема с выбором размера буфера, потому что я не знаю, это может быть любой файл, а также как читать из файла, используя while l oop? :

здесь я открыл первый файл:

  int fd1 = open(args[1], O_RDONLY);
  if(fd1 == -1){
        perror("error");
        return;
  }

, а здесь я открыл второй файл:

int fd2 = open(args[2], O_WRONLY|O_TRUNC);
          if (fd2 == -1) {                // if we couldn't open the file then create a new one (not sure if we supposed to this ?)
            fd2 = open(args[2], O_WRONLY|O_CREAT, 0666);
            if (fd2 == -1) {
                perror("error");
                return;
            }
          }

и вот как я пытаюсь прочитать:

char* buff;
 int count = read(fd1, buff, 1);  /// read from the file fd1 into fd2
              while (count != -1) {
                  if (!count) {
                      break;
                  }
                  if (write(fd2, buff, 1) == -1) {
                      perror("smash error: write failed");
                      return;
                  }
                  read_res = read(fd1, buff, 1);
                  if (read_res == -1) {
                      perror("smash error: read failed");
                      return;
                  }
              }
              cout <<"file1 was coppiesd to file 2" << endl ;

1 Ответ

0 голосов
/ 06 мая 2020

Вы должны прочитать указатели. Функция чтения хочет использовать указатель. Традиционное решение выглядит так:

#SIZE 255
char buff[SIZE]
int count = read(fd1, buff, SIZE)
//add logic to deal reading less then SIZE

Это потому, что имя массива является указателем на первый элемент в массиве.

Если вы хотите читать только один байт за раз , Я предлагаю сделать то, что я сделал ниже, и изменить buff на char (а не ptr на char) и просто передать адрес buff с помощью &

 char buff;
 int count = read(fd1, &buff, 1);  /// priming read
              while (count != -1) {
                  if (!count) {
                      break;
                  }
                  if (write(fd2, &buff, 1) == -1) {
                      perror("smash error: write failed");
                      return;
                  }
                  read_res = read(fd1, &buff, 1);
                  if (read_res == -1) {
                      perror("smash error: read failed");
                      return;
                  }
              }
              cout <<"file1 was coppiesd to file 2" << endl ;

Сообщите мне, если это не сработает

...