【问题标题】:Print the percentage during a transfer在传输过程中打印百分比
【发布时间】:2012-09-25 19:42:04
【问题描述】:

这段代码是我开发的一个 FTP 客户端的一部分:

  for(size_to_receive = file_size; size_to_receive > 0;){
    nread = read(f_sockd, filebuffer, size_to_receive);
    if(nread < 0){
      perror("read error on retr");
      close(fd);
      return -1;
    }
    if(write(fd, filebuffer, nread) != nread){
      perror("write error on retr");
      close(fd);
      return -1;
    }
    size_to_receive -= nread;
  }

我想实现下载文件的百分比,但我有一些问题。我试过这种方法:

  for(size_to_receive = file_size; size_to_receive > 0;){
    nread = read(f_sockd, filebuffer, size_to_receive);
    tx += nread;
    printf("%d%%\n", (tx * 100 / file_size));
    fflush(NULL);
    if(nread < 0){
      perror("read error on retr");
      close(fd);
      return -1;
    }
    if(write(fd, filebuffer, nread) != nread){
      perror("write error on retr");
      close(fd);
      return -1;
    }
    size_to_receive -= nread;
  }

但我不喜欢它,因为当传输开始时,会立即打印“20%”,还因为如果我从 20%%\n - 40%%\n 等中删除 \n,这些值将打印在传输结束,而不是立即结束。

如何开发更好的代码?

【问题讨论】:

标签: c progress percentage


【解决方案1】:
for (size_to_receive = file_size; size_to_receive > 0;) {
    nread = read(f_sockd, filebuffer, size_to_receive);
    tmp_xc += nread;

    printf("%d%%\r", (tmp_xc * 100 / file_size));
    fflush(NULL);
}

【讨论】:

  • 更好的解决方案。尽管您可以轻松地将其修改为仅显示 20% 的增量 :)
  • 更好的是,您可以在末尾使用\r 使其就地更新以获得更好的用户界面。
  • 导致此行为的file_size 的值是多少?可能是整数溢出。
  • 我是个白痴!!!!我已经将 tmp_xc 声明为 int xD 你是对的,我遇到了整数溢出
【解决方案2】:

【讨论】:

  • 顺便说一下,cout 相当于printf()。我相信您可以在 Google 上找到许多使用 ncurses 的 C 语言进度条示例。
猜你喜欢
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 2022-06-18
  • 1970-01-01
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多