Как записать файл с 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);
}
11
задан Peter Mortensen 5 January 2010 в 20:21
поделиться

3 ответа

Вам нужно записать данные 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);

Update: добавил нужные открытые...

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

14
ответ дан 3 December 2019 в 03:35
поделиться
[

] Во-первых, написанный вами код не переносится, даже если вы заставите его работать. Зачем использовать специфичные для операционной системы функции, если есть идеально платформонезависимый способ? Вот версия, которая использует только один заголовочный файл и переносится на любую платформу, которая реализует стандартную библиотеку 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. standard, however.[

] [
]
10
ответ дан 3 December 2019 в 03:35
поделиться

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

3
ответ дан 3 December 2019 в 03:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: