如何用数字替换文件中连续出现的字符

How to replace successive occurrences of characters in a file by the number

在我的代码中,我成功打开了文件,但现在我不明白如何使用 read() 函数执行循环,以获取 file1 中的所有字符。我设置了大小为8的缓冲区,但是文件内容更多。

谢谢。也请帮助我使用这样的系统调用来做到这一点

您对 char 和指向 char 的指针感到困惑:

char *buffer[4096];

是指向字符的指针数组,应该保存指针,而不是 chars。你想要的是 char:

的数组
char buffer[4096];

现在,当您添加 [=20=] 时,您将遇到编译器错误。这也意味着它包含一个字符串,这意味着您使用 %s 转换为 printf 来打印它,不涉及循环,只需执行:

printf("%s", buffer);

另外,你的 read 像这样(同样不需要循环):

ssize_t count = read(fd1, buffer, sizeof buffer - 1);
if(count < 0)
    return -1;

这将最多读取 4095 个字节到您的数组中,具体取决于文件的大小。这为您的 [=20=].

留出了空间

因此,为了确保您阅读了所有文件,请执行以下操作:

ssize_t count;
while((count = read(fd1, buffer, sizeof buffer - 1)) != 0)
{
    if(count < 0)
        return -1;

    buffer[count] = '[=14=]';
    printf("%s", buffer);

    // Do your processing here
}

想法是从文件中读取一个块,然后根据需要处理它,然后读取另一个块等。当到达文件末尾时,read 将 return 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)是否为零。