Как написать файл с C в Linux? - PullRequest
11 голосов
/ 05 января 2010

Я хочу переписать команду "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);
}

Ответы [ 3 ]

14 голосов
/ 05 января 2010

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

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

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

10 голосов
/ 05 января 2010

Прежде всего, написанный вами код не переносим, ​​даже если вы заставите его работать. Зачем использовать специфичные для ОС функции, когда существует совершенно независимый от платформы способ сделать это? Вот версия, которая использует только один заголовочный файл и переносима на любую платформу, которая реализует стандартную библиотеку 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;
}

РЕДАКТИРОВАТЬ: ссылка glibc имеет это сказать:

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

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

3 голосов
/ 05 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...