2010-01-05 3 views
11

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

текущий код С:

#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

Неиспользованная переменная fd2; не забудьте проверить, что запись пишет все, что вы ожидали; не используйте назначения как условия (используйте GCC -Wall); еще лучше вернуть значение из main(), хотя C99 (по ошибке) позволяет вам оставить возврат с main(). Ваше сообщение об ошибке для fd1 неверно; вы не выходите, если он не работает на fd1. Вы можете использовать sizeof (buffer) в read вместо 50, который равен половине вашего буфера. Ошибки классически записываются в stderr, а не в stdout. Ваша петля сталкивается с проблемами, если чтение не выполняется (отрицательное значение), а не возвращает ничего. –

+0

Просто скопировал и вставил код на мою машину, скомпилированный с помощью gcc, и он отлично работает. – Dipstick

+0

О, случилось что-то чудо.Из-за вашего комментария я попытался переместить файл в другое место и снова проверить. Оно работает!!! Огромное спасибо. – Devyn

ответ

12

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

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 может быть OR-нут (O_CREAT | O_WRONLY). На самом деле вы открываете слишком много файлов. Просто сделайте открытую раз.

+0

Привет, спасибо за ответ. Я редактировал свой пост с новым кодом. Я пробовал, как вы сказали, но все еще не работает. Ничего не записывается в новый файл. Пожалуйста, помогите мне! – Devyn

+0

Обновлено мое сообщение, надеюсь, это немного лучше ... – dlamotte

+0

Прошу прощения, но все еще не работает. Я поставил строку внутри цикла while, и показал, что while цикл работал только один раз. :( – Devyn

2

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

7

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

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

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

+0

Меня будет заинтересовать канал назад о том, почему именно я получил downvoted на этом ... –

+0

Я думаю, что вы хорошо разбираетесь в использовании потоков ... (я не проголосовал за вас), но я верну вас обратно к нулю. – dlamotte

+0

Сам downvote меня совсем не беспокоит, меня интересует _why_. Обратная связь, будь то положительная или отрицательная, помогает мне улучшить себя. Если я смогу сделать это, хотя (надеюсь), помогать кому-то еще в одно и то же время, ничего подобного. –

Смежные вопросы