在 while 条件下赋值

Assigning value inside while condition

我正在尝试将 read 的 return 值分配给一个变量,同时检查 while 条件中该值的条件。

while(reader=(read(fd, temp, BUFFER_SIZE)) >= BUFFER_SIZE)

但不是分配正确的值,而是分配条件的值(0 或 1)。 我该如何解决这个问题?我需要将它分配给一个变量,因为我以后会用到它,而且我不能在循环内声明它。

赋值必须加括号,不仅仅是函数调用:

while ((reader = read(fd, temp, BUFFER_SIZE)) >= BUFFER_SIZE) ...

但是请注意,读取的字节数不能大于请求的字节数,并且根据 reader 的类型和符号,比较将使用有符号或无符号算术,使 return -1 的值大于 BUFFER_SIZE。为避免这种情况,reader 必须定义为 ssize_t 或其他一些带符号的类型。

更复杂的是,BUFFER_SIZE 可以定义为无符号数,例如 #define BUFFER_SIZE 4096U#define BUFFER_SIZE sizeof(temp),即使 reader 也会强制执行无符号算术有一个签名类型...

这里有一个更安全的方法:

    unsigned char temp[BUFFER_SIZE];
    ssize_t nread;

    while ((nread = read(fd, temp, sizeof temp)) > 0) {
        // handle nread bytes...
    }
    if (nread < 0) {
        // handle read error
    } else {
        // reached end of file successfully
    }

上面的循环不会处理可能导致read到return-1的信号。 你可以为此添加一个特殊的测试:

    unsigned char temp[BUFFER_SIZE];
    ssize_t nread;

    for (;;) {
        nread = read(fd, temp, sizeof temp);
        if (nread < 0) {
            if (errno == EINTR) {
                // read attempt was interrupted by signal, restart
                continue;
            }
            fprintf(stderr, "read error: %s\n", strerror(errno));
            break;
        }
        if (nread == 0) {
            // normal end of file
            break;
        }
        // handle nread bytes...
    }

>= 的优先级高于 =。您编写代码的方式相当于执行以下操作:

  1. TEMP = read(fd, temp, BUFFER_SIZE);
  2. reader = (TEMP) >= BUFFER_SIZE;

由于优先规则,在reader中存储了一个布尔值。

你想要的是将 TEMP 存储到 reader 中并将 readerBUFFER_SIZE 进行比较,然后你需要添加一些括号以便在比较,这会将 2. 更改为:(reader = TEMP) >= BUFFER_SIZE;

所以你的代码应该是:

while((reader= read(fd, temp, BUFFER_SIZE)) >= BUFFER_SIZE)