【问题标题】:Append to buffer using read() in C在 C 中使用 read() 追加到缓冲区
【发布时间】:2016-04-25 13:21:04
【问题描述】:

我想使用 C 语言中的 read() 命令将文本文件中的数据以 20 个字符的块形式读取到缓冲区中,直到文件结束。

while (n != 0) {    
    n = read(filedescriptor, buffer, 20);
}

这每次都会覆盖缓冲区。是否可以使用read() 命令追加到缓冲区?

【问题讨论】:

  • 好吧,您实际上可以使用返回值来查看已经读取了多少个字符,然后将该值添加到 buffer 以使函数附加到之前读取的现有数据,同时特别注意不要溢出缓冲区,即读取超过 20 个字符。
  • 如果你的缓冲区只有 20 个字符长,在后面追加数据会挤压其他数据

标签: c file append buffer


【解决方案1】:

绝对有可能。但是你应该确定你的缓冲区有多大。

如果你有

#define BUFFER_SIZE 200
char buf[BUFFER_SIZE];
int nbuf = 0;       /* number of characters read into buffer */
int r;

你可以写类似的东西

while(nbuf < BUFFER_SIZE) {
    int n_to_read = 20;
    if(nread + n_to_read > BUFFER_SIZE) /* make sure won't overflow buffer */
        n_to_read = BUFFER_SIZE - nread;
    r = read(fd, &buf[nbuf], n_to_read);
    if(r <= 0) break;    /* error / EOF */
    nbuf += r;
}

如果您想证明您对 C 中数组和指针之间“等价”的理解,可以将 read 调用重写为

    r = read(fd, buf + nbuf, n_to_read);

事实上,很多人都会这样写。

附:我会使用freadFILE * 指针而不是read 和整数文件描述符。

【讨论】:

  • 其实如果r &lt; 0你应该通过测试errno == EINTR来检查read是否被信号中断并重新开始操作。
  • read(fd, &amp;buf[nbuf], BUFFER_SIZE - nbuf); 中到底发生了什么——为什么&amp;buf 之前,为什么[nbuf]buf 之后以及为什么BUFFER_SIZE - nbuf
  • 那么,您对数组和指针了解多少?在这种情况下,“缓冲区”是一个字符数组。我们可以有一个指向字符数组的指针。当我们调用read 时,我们给它一个指针,告诉它在哪里写它为我们写的字符。我们还告诉它允许读取多少个字符。如果指针指向缓冲区的开头,它可以读取缓冲区可以容纳的尽可能多的字符,但如果指针指向缓冲区中间的某个位置,我们必须告诉它读取更少。
  • 但实际上我的代码是错误的,它不再像你问的那样一次读取 20 个字符。我必须修复它。
猜你喜欢
  • 2019-11-24
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
相关资源
最近更新 更多