Невозможно скопировать весь файл в другой с помощью системного вызова write

Я должен скопировать содержимое файла file1 в буфер (размером 23 байта), а затем скопировать данные из буфера в файл file2.

У меня есть проблемы, чтобы убедиться, что file1 полностью скопирован в буфер. Когда буфер копируется в файл file2, файл file2 содержит только часть содержимого файла file1, и в выводе говорится, что только 4 байта данных были скопированы в файл file2.

Я пытался понять, что я сделал не так, но пока мне не везет. Ваша помощь будет очень признательна.

Я использую Oracle VM VirtualBox, где у меня установлена ​​Ubuntu.

Я также использую make (MakeFile) для обновления всех файлов одновременно в командной строке.

Мой код ниже в C/POSIX.

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

#define  My_Full_Name "AAA!"

int PrintSentence()
{

  size_t buffersize = (size_t) (4 * 5.75);  //or (4 bytes * 5.75) = 23 bytes
  char buffer[buffersize];
  char source_file[200];
  char destination_file[200];

  ssize_t bytes_read;

  int fdSource, fdDestination;

  mode_t mode = S_IRUSR | S_IWUSR;

  printf("Welcome to File Copy by %s\n", My_Full_Name);

  printf("Enter the name of the source file: ");

  scanf("%s", source_file);

  printf("Enter the name of the destination file: ");

  scanf("%s", destination_file);

  fdSource = open(source_file, O_RDONLY);

  if (fdSource < 0)
  {
    perror("Open failed!!");
    return 1;
  }

  else
  {

    bytes_read = read(fdSource, buffer, sizeof(buffer));

    fdDestination = open(destination_file, O_CREAT | O_WRONLY | mode);

    if (fdDestination < 0)
    {
      perror("Oups!! cannot create file again!!");

      return 1;
    }
    else
    {
      write(fdDestination, buffer, sizeof(buffer));
      printf("current content of buffer: %s\n", buffer); //just to check
      printf("current value of buffer size = %zd  \n", buffersize); //just to check
      printf("File copy was successful, with %d byte copied\n", fdDestination); //the output says only 4 bytes are copied

    }

  }

  return;

}

2 ответа

Решение

Вот:

printf("File copy was successful, with %d byte copied\n", fdDestination );

fdDestination это дескриптор файла, это не количество записанных байтов. 0, 1 а также 2 ваши три стандартных потока, 3 будет ваш входной файл, который открывается первым, так 4 будет вашим выходным файлом, поэтому он всегда выводит 4,

Вы хотите сохранить возвращаемое значение из write()и вместо этого используйте значение этого значения (после проверки этого возвращаемого значения на наличие ошибок, конечно, что вы должны делать для read() также).

РЕДАКТИРОВАТЬ: Немного изменив свой код:

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

#define  My_Full_Name "AAA!"

int main(void) {
    size_t buffersize = (size_t) (4 * 5.75);
    char buffer[buffersize];
    char source_file[200];
    char destination_file[200];

    ssize_t bytes_read, bytes_written;
    int fdSource, fdDestination;

    mode_t mode = S_IRUSR | S_IWUSR;

    printf("Welcome to File Copy by %s\n", My_Full_Name);
    printf("Enter the name of the source file: ");
    scanf("%s", source_file);

    printf("Enter the name of the destination file: ");
    scanf("%s", destination_file);

    fdSource = open(source_file, O_RDONLY);

    if (fdSource < 0) {
        perror("Open failed!!");
        return 1;
    } else {
        bytes_read = read(fdSource, buffer, sizeof(buffer));
        fdDestination = open(destination_file, O_CREAT | O_WRONLY | mode);

        if (fdDestination < 0) {
            perror("Oups!! cannot create file again!!");
            return 1;
        } else {
            bytes_written = write(fdDestination, buffer, sizeof(buffer));
            printf("current content of buffer: %s\n", buffer);
            printf("current value of buffer size = %zd  \n", buffersize);
            printf("File copy was successful, with %d byte copied\n",
                    bytes_written);
        }
    }

    return 0;
}

дает мне это:

paul@local:~/src/c/fpc$ cat infile
12345678901234567890123
paul@local:~/src/c/fpc$ ./fpc
Welcome to File Copy by AAA!
Enter the name of the source file: infile
Enter the name of the destination file: outfile
current content of buffer: 12345678901234567890123
current value of buffer size = 23
File copy was successful, with 23 byte copied
paul@local:~/src/c/fpc$ cat outfile; echo ""
12345678901234567890123
paul@local:~/src/c/fpc$

Как вы можете ожидать, что файл будет полностью записан в буфер, если ваш буфер имеет длину всего 23 байта? При вызове read вы читаете только 23 байта и оставляете остальное содержимое файла1 нетронутым. Или вы ожидаете, что ваша программа будет копировать только 23 байта своего содержимого в целевой файл?

Другие вопросы по тегам