您对char 和指向char 的指针感到困惑:
char *buffer[4096];
是一个指向字符的指针数组,应该保存指针,而不是chars。你想要的是char的数组:
char buffer[4096];
现在,当您添加 \0 时,您将收到编译器错误。这也意味着它包含一个字符串,这意味着您使用printf 的%s 转换来打印它,不涉及循环,只需这样做:
printf("%s", buffer);
另外,像这样执行read(同样不需要循环):
ssize_t count = read(fd1, buffer, sizeof buffer - 1);
if(count < 0)
return -1;
这将最多读取 4095 个字节到您的数组中,具体取决于文件的大小。这为您的\0 留出了空间。
为了确保您阅读了所有文件,请执行以下操作:
ssize_t count;
while((count = read(fd1, buffer, sizeof buffer - 1)) != 0)
{
if(count < 0)
return -1;
buffer[count] = '\0';
printf("%s", buffer);
// Do your processing here
}
这个想法是从文件中读取一个块,然后根据需要对其进行处理,然后读取另一个块等。当到达文件末尾时,read 将返回 0 并且您的处理将停止。
执行此循环的等效方法是:
ssize_t count = read(fd1, buffer, sizeof buffer - 1);
while(count != 0)
{
// .....
count = read(fd1, buffer, sizeof buffer - 1);
}
这更清楚地表明您正在循环直到count 为零。我使用的技巧是将count = read(...) 部分放在括号内。评估括号内的内容(count = read(...)) 的结果是赋值的结果(即赋值给count,这是read 的结果)。把它放在while 语句中意味着括号中的部分首先被评估(即它执行read 并分配count)。然后检查分配的结果(即count),看它是否为零。