Как написать файл с C в Linux?

Я хочу переписать команду "cp" для Linux. Таким образом, эта программа будет работать как #./a.out originalfile copiedfile. Я могу открыть файл, создать новый файл, но не могу записать новый файл. Ничего не написано. В чем может быть причина?

Текущий код C:

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

int main(int argc,char *aa[]){
    int fd,fd1;
    char buffer[100];

    if(argc!=3){
        printf("Usage : ./a.out <original> <copy> \n");
        return -1;
    }

    fd=open(aa[1],O_RDONLY,S_IRUSR);
    if(fd==-1){
        printf("file not found.\n");
        return -1;
    }
    fd1=open(aa[2],O_CREAT | O_WRONLY,S_IRUSR);
    if(fd1!=-1){
        printf("file is created.\n");
    }
    ssize_t n;
    while(n=read(fd,buffer,50)){
        write(fd1,buffer,n);
        printf("..writing..\n");
    }
    close(fd);
    close(fd1);
}

Ответ 1

Вам нужно записать() данные read() в новый файл:

ssize_t nrd;
int fd;
int fd1;

fd = open(aa[1], O_RDONLY);
fd1 = open(aa[2], O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
while (nrd = read(fd,buffer,50)) {
    write(fd1,buffer,nrd);
}

close(fd);
close(fd1);

Обновление: добавлено правильное открытие...

Btw, O_CREAT может быть OR'd (O_CREAT | O_WRONLY). На самом деле вы открываете слишком много файлов. Просто сделайте однократное открытие.

Ответ 2

Прежде всего, код, который вы написали, не переносится, даже если вы его заработаете. Зачем использовать функции, специфичные для ОС, когда есть совершенно независимый от платформы способ сделать это? Здесь версия, которая использует только один файл заголовка и переносима на любую платформу, которая реализует стандартную библиотеку C.

#include <stdio.h>

int main(int argc, char **argv)
{
    FILE* sourceFile;
    FILE* destFile;
    char buf[50];
    int numBytes;

    if(argc!=3)
    {
        printf("Usage: fcopy source destination\n");
        return 1;
    }

    sourceFile = fopen(argv[1], "rb");
    destFile = fopen(argv[2], "wb");

    if(sourceFile==NULL)
    {
        printf("Could not open source file\n");
        return 2;
    }
    if(destFile==NULL)
    {
        printf("Could not open destination file\n");
        return 3;
    }

    while(numBytes=fread(buf, 1, 50, sourceFile))
    {
        fwrite(buf, 1, numBytes, destFile);
    }

    fclose(sourceFile);
    fclose(destFile);

    return 0;
}

EDIT: ссылка glibc позволяет:

В общем, вы должны придерживаться использование потоков, а не файлов дескрипторов, если которую вы хотите сделать может выполняться только в дескрипторе файла. Если вы начинающий программист и не уверены, какие функции использовать, мы предположите, что вы концентрируетесь на форматированные входные функции (см. Форматированный вход) и отформатированный вывод функции (см. "Отформатированный вывод" ).

Если вы обеспокоены переносимостью ваших программ в другие системы, кроме GNU, вы также должны знать, что дескрипторы файлов не являются переносимыми как потоки. Вы можете ожидать, что любая система запуск ISO C для поддержки потоков, но не-GNU-системы могут не поддерживать файл дескрипторы вообще или могут реализовать подмножество GNU функции, которые работают с файлом дескрипторы. Большая часть файла функции дескриптора в GNU библиотеки включены в POSIX.1 стандарт, однако.

Ответ 3

Вы должны сделать write в том же цикле, что и read.