在 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...
}
>=
的优先级高于 =
。您编写代码的方式相当于执行以下操作:
TEMP = read(fd, temp, BUFFER_SIZE);
reader = (TEMP) >= BUFFER_SIZE;
由于优先规则,在reader
中存储了一个布尔值。
你想要的是将 TEMP
存储到 reader
中并将 reader
与 BUFFER_SIZE
进行比较,然后你需要添加一些括号以便在比较,这会将 2.
更改为:(reader = TEMP) >= BUFFER_SIZE;
所以你的代码应该是:
while((reader= read(fd, temp, BUFFER_SIZE)) >= BUFFER_SIZE)
我正在尝试将 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...
}
>=
的优先级高于 =
。您编写代码的方式相当于执行以下操作:
TEMP = read(fd, temp, BUFFER_SIZE);
reader = (TEMP) >= BUFFER_SIZE;
由于优先规则,在reader
中存储了一个布尔值。
你想要的是将 TEMP
存储到 reader
中并将 reader
与 BUFFER_SIZE
进行比较,然后你需要添加一些括号以便在比较,这会将 2.
更改为:(reader = TEMP) >= BUFFER_SIZE;
所以你的代码应该是:
while((reader= read(fd, temp, BUFFER_SIZE)) >= BUFFER_SIZE)