【问题标题】:How to replace successive occurrences of characters in a file by the number如何用数字替换文件中连续出现的字符
【发布时间】:2019-09-22 14:14:30
【问题描述】:

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

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

【问题讨论】:

  • 欢迎来到 SO。请不要在标题中添加 C 前缀。这就是标签的目的。
  • 仅供参考,这称为run-length encoding

标签: c string file pointers file-descriptor


【解决方案1】:

您对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),看它是否为零。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 2020-07-19
  • 2021-11-19
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多