【发布时间】:2022-01-03 20:09:25
【问题描述】:
我似乎无法让部分 write() 工作。它从内存中消失了,我不知道为什么。
int fd = open(path, O_RDONLY);
if(fd == -1) {error handling}
const size_t read_size = 100;
size_t size = read_size;
size_t offset = 0;
size_t res = 0;
char *buff = malloc(size+1);
int lines = 0;
int pos = 0;
while((res = read(fd, buff + offset, read_size)) > 0)
{
if(res == -1){error handling}
offset += res;
buff[offset] = '\0';
if (offset + read_size > size)
{
size *= 2;
buff = realloc(buff, size+1);
}
}
for(size_t i = 0;buff[i] != '\0'; i++) // counting the buff lines
{
if(buff[i] == '\n')
{
lines++;
}
}
size = read_size;
offset = 0;
res = 0;
if(lines < 10)
{
while((res = write(STDOUT_FILENO, buff+offset, read_size)) > 0)
{
offset += res;
}
}
buff[offset] = '\0';
else{another case where the position is found where the write() needs to start printing}
这是 c 中尾部实现的一部分。还有另一个函数处理标准输入并做同样的事情(这个处理文件)。
【问题讨论】:
-
部分写入很少发生。一种可能发生的方法是,如果您尝试将 4 KiB 的数据写入一个只剩下 1 KiB 空间的文件系统。其他方式也同样神秘。
-
部分写入是什么意思,代码具体应该做什么?
-
整个程序应该是函数尾部。然而,一个要求是我支持部分读/写。我的程序在 for 循环和逐字节打印时工作得非常好,但不能让它与部分 write() 一起工作。在 buff 中存储文件或标准输入数据,需要打印。所以我需要将其部分写入()到标准输出。
-
为什么要在部分写入时增加缓冲区大小。如果有的话,它应该缩小
-
请用文字描述第二个
while循环应该做什么?如果行数小于10,是否应该回显(写回)所有读取的数据?在这种情况下,为什么要在第二个while循环中调整缓冲区的大小?这没有意义。