Ваш код в порядке, но вы можете убедиться, что исходный файл доступен для чтения, прежде чем пытаться скопировать его содержимое. Также вы можете прекратить выполнение программы в случае ошибки.
char ch;
int src, dst;
if( argc != 3 )
{
printf("argument error\n");
printf("usage: ./a.out src dest\n");
exit(1); // Terminate the program
}
if ((src = open( argv[1], O_RDONLY )) == -1)
{
printf("Error accessing source file.\n");
exit(1);
}
if (dst = open( argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644 )) == -1)
{
printf("Error accessing destination file.\n");
exit(1);
}
while( read( src, &ch, 1 ) > 0 )
write( dst, &ch, 1 );
close( src );
close( dst );
return 0;
Кроме того, если вторым аргументом всегда будет каталог, вам нужно установить для команды open
для файла назначения комбинацию второго и первого аргументов (argv[2]
, объединенный с argv[1]
).
Для этого вы можете использовать функцию strcat
, которая копирует содержимое второй строки в первую. Начните с добавления #include <string.h>
в заголовок вашей программы:
char* buffer[BUF_SIZE];
int src, dst;
int bytesRead;
char dstFile[1024];
if (argc != 3)
{
printf("argument error\n");
printf("usage: ./a.out src dest\n");
}
if ((src = open(argv[1], O_RDONLY)) == -1)
{
printf("Error accessing source file.\n");
exit(1);
}
strcat(dstFile, argv[2]);
strcat(dstFile, argv[1]);
if ((dst = open(dstFile, O_WRONLY | O_CREAT | O_TRUNC, 0644)) == -1)
{
printf("Error accessing destination file. %s\n", dstFile);
exit(1);
}
while ((bytesRead = read(src, buffer, BUF_SIZE)) > 0)
{
write(dst, buffer, bytesRead);
}
close(src);
close(dst);
return 0;