LINUX.ORG.RU

вопрос по циклам в c

 


0

1

нужен цикл while вот такого вида:

while (c_read += read(f_desc, buffer, 10))

как заставить делать проверку возвращаемого значения из read, а не переменной c_read, так как при проверки переменной цикл получается бесконечный

★★

Отдельную переменную для возвращаемого значения определи и используй. А аккумулятор c_read наращивай в теле цикла.

DeVliegendeHollander ★★ ()
ssize_t ret;
ssize_t bytes_read = 0;
while (1) {
  ret = read(f_desc, buffer+bytes_read, msg_len-bytes_read);
  if (ret <= 0) {
    do_error_process(ret);
    break;
  }
  bytes_read += ret;
  if (bytes_read >= msg_len) {
    break;
  }
}
nanoolinux ★★★★ ()
Ответ на: комментарий от DeVliegendeHollander

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

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

тебе не кажется, что от переносимого ассемблера с макросами ты слишком много хочешь?

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

меня слово ассемблер в вашем определении заставляет хотеть много)))

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

Я не понимаю: тебе «шашечки» или «ехать»?

Всегда так делаю: переменная для проверки возвращаемого значения read/write отдельно, аккумулятор — отдельно.

И nanoolinux уже вообще готовое решение дал, чего ж ты ещё-то извращаешься? :)

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

да в общем я уже все понял, просто пришла идея и не сразу понял, как ее реализовать, то есть я сразу понял, что нужна еще одна переменная, но подумал, что этого можно избежать, однако видимо нельзя.

меня с толку сбила конструкция if

где примерно так же допустимо делать

например:

if (count = read(...) == -1)

тогда сравнение происходит до момента присваения

а если так:

if ((count = read(...)) == -1)

то сперва присвоет, а потом проверит

IvanR ★★ ()

как заставить делать проверку возвращаемого значения из read, а не переменной c_read, так как при проверки переменной цикл получается бесконечный

ssize_t count, c_read;
/* ... */
while((c_read += (count = read(f_desc, buffer, 10))), count > 0)

Можно сделать как-то так. Но не нужно. Серьезно.

theNamelessOne ★★★★★ ()

man 3 read в начале почитал бы

size_t ret;
while(len !=0 &&(ret=read(fd,buf,len))!=0){
if(ret==-1) {   
if (errno==EINTR)
continue;
perror("read");
break;
}
len-=ret;
buf+=ret;
}

Boy_from_Jungle ★★★★ ()
Последнее исправление: Boy_from_Jungle (всего исправлений: 1)
Ответ на: комментарий от Boy_from_Jungle

а ну и если у тебя идет неблокирующее чтение то ты должен еще делать проверку ошибки на EAGAIN, чтобы корректно все считать

Boy_from_Jungle ★★★★ ()

нечитаемые конструкции не нужны
они погубили perl и погубят ruby и скалу
а java, php и python будут жить

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

+ Type(c_read) t;

+ fun CallErorHnd()

while ((t=read(f_desc, buffer, 10)?c_read +=t:CallErorHnd(),0)

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

В первом случае в count влетает результат сравнения, во втором результат read. А не то, что ты себе придумал.

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

ну это все равно пример с 2-мя переменными, а не с одной, хоть и записан в одну строчку)))

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

хотклось бы изыскать способ заставить компилятор проверить возвращаемое значение, а потом, если оно не равно нулю, приплюслвать к переменной.

Тут справится только ЛИСП.

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

ОП то ли стесняется написать readaux(fd, buf, count, pcount), то ли хочет это из коробки, причем тут лисп?

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

То, что хочет ТС и так понятно, но свои хотелки он облекает в странные слова.

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

Такого и нет. Пишешь его себе один раз и получаешь профит.

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