fwrite 是否可以写入一些字节但 return 为零?
Is it possible for fwrite to write some bytes but return zero?
根据 fwrite
的手册页:
fread()
and fwrite()
return the number of items successfully read or written (i.e., not the number
of characters). If an error occurs, or the end-of-file is reached, the return value is a short
item count (or zero).
我想知道 fwrite(ptr, 65537, 1, fp)
是否可以只写 512 个字节而 return 为零?
我试图快速跟踪 glibc-2.12.2 源代码。
malloc/malloc.c:#define fwrite(buf, size, count, fp) _IO_fwrite (buf, size, count, fp)
我想真正的实现是在 iofwrite.c.
_IO_size_t
_IO_fwrite (buf, size, count, fp)
const void *buf;
_IO_size_t size;
_IO_size_t count;
_IO_FILE *fp;
{
_IO_size_t request = size * count;
_IO_size_t written = 0;
CHECK_FILE (fp, 0);
if (request == 0)
return 0;
_IO_acquire_lock (fp);
if (_IO_vtable_offset (fp) != 0 || _IO_fwide (fp, -1) == -1)
written = _IO_sputn (fp, (const char *) buf, request);
_IO_release_lock (fp);
/* We have written all of the input in case the return value indicates
this or EOF is returned. The latter is a special case where we
simply did not manage to flush the buffer. But the data is in the
buffer and therefore written as far as fwrite is concerned. */
if (written == request || written == EOF)
return count;
else
return written / size;
}
所以,我想 fwrite 的 return 代码中有可能 return 0,即使它确实向文件中写入了一些字节。
是的 — fwrite(ptr, 65537, 1, fp)
到 return 0 作为 return 代码是可能的,即使它确实向文件中写入了一些字节。
例如,如果磁盘上只剩下 space 512 字节,那么你有一个短写,但它写了 0 个完整的 65537 字节单元(这是一个奇怪的数字;通常它会是 65536,不是吗?),因此 return 值必须为 0。
如果你想知道到底写了多少,你应该使用:
nbytes = fwrite(ptr, 1, 65537, fp);
获取准确的字节数;现在你会从你假设的短文中得到 512。
根据 fwrite
的手册页:
fread()
andfwrite()
return the number of items successfully read or written (i.e., not the number of characters). If an error occurs, or the end-of-file is reached, the return value is a short item count (or zero).
我想知道 fwrite(ptr, 65537, 1, fp)
是否可以只写 512 个字节而 return 为零?
我试图快速跟踪 glibc-2.12.2 源代码。
malloc/malloc.c:#define fwrite(buf, size, count, fp) _IO_fwrite (buf, size, count, fp)
我想真正的实现是在 iofwrite.c.
_IO_size_t
_IO_fwrite (buf, size, count, fp)
const void *buf;
_IO_size_t size;
_IO_size_t count;
_IO_FILE *fp;
{
_IO_size_t request = size * count;
_IO_size_t written = 0;
CHECK_FILE (fp, 0);
if (request == 0)
return 0;
_IO_acquire_lock (fp);
if (_IO_vtable_offset (fp) != 0 || _IO_fwide (fp, -1) == -1)
written = _IO_sputn (fp, (const char *) buf, request);
_IO_release_lock (fp);
/* We have written all of the input in case the return value indicates
this or EOF is returned. The latter is a special case where we
simply did not manage to flush the buffer. But the data is in the
buffer and therefore written as far as fwrite is concerned. */
if (written == request || written == EOF)
return count;
else
return written / size;
}
所以,我想 fwrite 的 return 代码中有可能 return 0,即使它确实向文件中写入了一些字节。
是的 — fwrite(ptr, 65537, 1, fp)
到 return 0 作为 return 代码是可能的,即使它确实向文件中写入了一些字节。
例如,如果磁盘上只剩下 space 512 字节,那么你有一个短写,但它写了 0 个完整的 65537 字节单元(这是一个奇怪的数字;通常它会是 65536,不是吗?),因此 return 值必须为 0。
如果你想知道到底写了多少,你应该使用:
nbytes = fwrite(ptr, 1, 65537, fp);
获取准确的字节数;现在你会从你假设的短文中得到 512。