LINUX.ORG.RU

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

 


0

1

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

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

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

★★★

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

Отдельную переменную для возвращаемого значения определи и используй. А аккумулятор 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 ★★★
() автор топика
Ответ на: комментарий от 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 ★★★
()
Ответ на: комментарий от anonymous

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

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