Невозможно скопировать весь файл в другой с помощью системного вызова 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 байта своего содержимого в целевой файл?