LINUX.ORG.RU

Помогите с программой копирования фалов на си.


1

1

Всем привет ! Изучаю *nix по книге теория и практика программирования , есть исходник в книге вторая глава ввод/вывод простое копирование файлов , прога компилица но не работает в чем может быть причина ?? os= ubuntu 13.4

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#define BUFERSIZE 4096
#define COPYMODE 0644

void oops(char *, char *);
int main (int ac, char *av[])
{
           int in_fd, out_fd, n_chars;
          char buf[BUFERSIZE];
       if (ac != 3) {
                fprintf(stderr, "usage: %s source destination\n", *av);
                exit(1);
         {
        if ((in_fd = open(av[1], O_RDONLY)) == -1)
                [br]oops("Cannot open", av[1]);
        if ((out_fd = creat(av[2], COPYMODE)) == -1)
                oops("Cannot creat", av[2]);
        while ((n_chars = read(in_fd, buf, BUFERSIZE)) > 0)
                if (write(out_fd, buf, n_chars) != n_chars)
                        oops("Write error to", av[2]);
        if (n_chars == -1)
                oops("Read error from", av[1]);
        if (close(in_fd) == -1 || close(out_fd) == -1)
                oops("Error closing files", " ");

        void oops (char *s1, char *s2)
        {
                fprintf(stderr, "Error: %s", s1);
                perror(s2);
                exit(1);
        }
}



Последнее исправление: igoroppo6 (всего исправлений: 4)

^^^ истину глаголит!

perror сразу после ошибки нужно вызывать, а не после fprintf

nanoolinux ★★★★
()
Последнее исправление: nanoolinux (всего исправлений: 1)
int main (int ac, char *av[])
{
    char cmd[1024];
    sprintf(cmd, "cp %s %s", av[1], av[2]);
    system(cmd);
    return 0;
}

//thread

а по теме - надо вдумчиво почитать вывод компилятора!

компилица

и словарь русского языка!!11одинодин

aol ★★★★★
()

Две строчки после «if (ac != 3)» должны быть заключены в фигурные скобки

Gvidon ★★★★
()
Ответ на: комментарий от igoroppo6

по русскому твердая 2 :)))

И это-то повод для радости. Kids these days...

unlog1c ★★★
()
Ответ на: комментарий от igoroppo6

Компилятор не ругался !!!

А чего ему ругаться? Как ты написал, так он и скомпилит. Твои отступы ему побоку, ибо не пистон.

UVV ★★★★★
()
Ответ на: комментарий от unt1tled

Скобки поправил но :


/C/Teoria_i_practica/ch2$ gcc cp1.c -o cp1
/tmp/cc1KAZRP.o: In function `main':
cp1.c:(.text+0xa4): undefined reference to `oops'
cp1.c:(.text+0xe9): undefined reference to `oops'
cp1.c:(.text+0x136): undefined reference to `oops'
cp1.c:(.text+0x185): undefined reference to `oops'
cp1.c:(.text+0x1b8): undefined reference to `oops'
collect2: error: ld returned 1 exit status

igoroppo6
() автор топика

В дополнение к совету про скобки добавлю совет использовать нормальные текстовые редакторы, которые отступы сами расставляют. В итоге если забыл скобку - будет не такой как надо отступ и следовательно будет ясно что ошибка.

зы определение oops из main...

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 1)

Если ты символ в символ переписал эту программу со своего учебника, тогда выйди во двор и сожги его. Погреешься зато, хоть какая-то от него польза будет.

UVV ★★★★★
()
Ответ на: комментарий от igoroppo6

Теперь самую последнюю закрывающую скобку перенеси так, чтобы она располагалась до определения oops

Gvidon ★★★★
()
Ответ на: комментарий от UVV

Кстати да, я чё-то мысль про прокладку отмёл как-то...

И зря. Синтаксис си слишком, кхм, неоднозначен, чтобы сразу отметать подобные мысли.

anonymous
()
Ответ на: комментарий от anonymous

Синтаксис си слишком, кхм, неоднозначен, чтобы сразу отметать подобные мысли.

Очнись, он с книги программу переписывает!

UVV ★★★★★
()
Ответ на: комментарий от UVV

Очнись, он с книги программу переписывает!

Ага, готов поспорить, что это какой-то говноперевод, где скобки просто забыли. И что?

anonymous
()
Ответ на: комментарий от UVV

против системы

Это как? В сях табами, а питоне скобочками?

nanoolinux ★★★★
()
Ответ на: комментарий от UVV

Спасибо за указку !! Это просто пятница и куча дел не связанных с обучением (работа мать ее) сто дел одновременно!!

igoroppo6
() автор топика
Ответ на: комментарий от igoroppo6

Извиняюсь а ты как учился ? По моему книга это одно из древнейших методов обучения !

Безусловно, но если в книге пишут ахинею, то зачем стоит её рассматривать, как подходящее средство к обучению? Либо в книге фигня, либо ты криво списал, тут уж одно из двух.

UVV ★★★★★
()
Ответ на: комментарий от UVV

Это я криво списал !! Книга зачетная это я просто был не внимательный! Unix/Linux. Теория и практика программирования брюс моли

Лучше ни чего не нашел (кроме стивенсана но она суховата для начала).

Еще раз спасибо !!! Удачных выходных!!!

igoroppo6
() автор топика
Ответ на: комментарий от BambarbiyaKirgudu

почему тексты программ на с++ выглядят как говно?

ну ладно ты дремучий и не знаешь, как выглядит код на С, но автор же явно написал ЯП, а ручная реализация копирования файла на С++ выглядит, например, так:

ofstream( "out.txt" ) << ifstream( "in.txt" ).rdbuf();

а если ты умеешь только использовать библиотечные функции, то лучший вариант взять Qt

wota ★★
()
Ответ на: комментарий от wota

Полезная ссылка спасибо ! Я изучаю си не для того чтобы потом устроится программером. У меня задача заключается в разборе полетов как все устроено в Unix/Linux для грамотной диагностики проблемы в производительности системы (dtrace, systat). Если есть еще полезные ссылки поделись плиз!!

igoroppo6
() автор топика
Ответ на: комментарий от igoroppo6

Unix/Linux. Теория и практика программирования брюс моли

Книга отличная, только сначала лучше прочитать K&R.

gv
()
Ответ на: комментарий от gv

Стивен Прата, «Язык программирования Си. Лекции и упражнения» ее читаю , K&R очень сложная показалась я в ЯП полный лох мне нужно чтобы все разжевали и по лучше.

igoroppo6
() автор топика

Тяжело жить без исключений, понимаю.

crowbar
()

Что будешь делать, если это не main? После каждого вызова проверять значение if-ом и в случае ошибки закрывать все предыдущие дескрипторы? Или какой-нибудь хитрый макрос для этого напишешь?

А может быть напишешь один обработчик в конце и кинешь туда goto из if'а? Или это не дийкстраугодно?

crowbar
()
Ответ на: комментарий от Andersen

Керниган & Ритчи: http://www.ozon.ru/context/detail/id/2480925/

Прата: http://www.ozon.ru/context/detail/id/7979735/

Правда K&R я с мягкой обложкой брал, обошлось дешевле в два раза. Сейчас там такие кончились. А вообще, лучше читать в оригинале и заказать литературу на Amazon'е:

K&R: http://www.amazon.com/C-Programming-Language-2nd-Edition/dp/0131103628/

Prata: http://www.amazon.com/Primer-Plus-Edition-Developers-Library/dp/0321776402/

EXL ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.