Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中任意长时间执行的进度条——控制台_C_Progress - Fatal编程技术网

C中任意长时间执行的进度条——控制台

C中任意长时间执行的进度条——控制台,c,progress,C,Progress,我已经尽了最大努力,不仅搜索stackOverflow,而且搜索其他网站,但找不到符合我需要的东西。我要求的是能够显示进度条(例如,进度:#######……)。我现在真的不在乎这个百分比 现在是问题所在。我不能简单地执行0-100 for循环,因为我希望执行和跟踪的代码位于运行任意时间的while循环中(问题大小取决于用户的输入,因此不是常数) 我曾想过跟踪int变量中的迭代次数,并尝试按2、50或100进行模运算,但正如我所说,迭代次数取决于用户的输入,因此,只能在特定条件下进行管理。除了进度

我已经尽了最大努力,不仅搜索stackOverflow,而且搜索其他网站,但找不到符合我需要的东西。我要求的是能够显示进度条(例如,进度:#######……)。我现在真的不在乎这个百分比

现在是问题所在。我不能简单地执行0-100 for循环,因为我希望执行和跟踪的代码位于运行任意时间的while循环中(问题大小取决于用户的输入,因此不是常数)

我曾想过跟踪int变量中的迭代次数,并尝试按2、50或100进行模运算,但正如我所说,迭代次数取决于用户的输入,因此,只能在特定条件下进行管理。除了进度条外,没有其他输出,因此我执行了一个简单的printf(“#”);在while循环的内部和外部所有漂亮的东西

这也是个人偏好,但如果不包括,也不介意,我希望进度条长度为50个字符,以便100%执行=50个“#”字符


非常感谢您的帮助。

经过反复试验,我可能已经找到了解决方案,但希望与其他人进行核对

假设这些变量(全部为int类型):

num_迭代次数=0,最大进度=100,条长=50,num_项目=N

我已在以下位置打印了一个“#”字符:

if ((iteration / BAR_LENGTH) % (MAX_PROGRESS * BAR_LENGTH * num_items) == 0)
并得到我想要的结果:

|<------------- Enumeration Complete ------------->|
|##################################################| COMPLETED
||
|##################################################|完成
虽然这一点逐渐建立起来,但它并不是一种形式

|<------------- Enumeration Complete ------------->|
|##################################................|
||
|##################################................|

任何我能用\r或\b做的事情?

经过反复试验,我可能已经找到了解决方案,但希望与某人进行核对

假设这些变量(全部为int类型):

num_迭代次数=0,最大进度=100,条长=50,num_项目=N

我已在以下位置打印了一个“#”字符:

if ((iteration / BAR_LENGTH) % (MAX_PROGRESS * BAR_LENGTH * num_items) == 0)
并得到我想要的结果:

|<------------- Enumeration Complete ------------->|
|##################################################| COMPLETED
||
|##################################################|完成
虽然这一点逐渐建立起来,但它并不是一种形式

|<------------- Enumeration Complete ------------->|
|##################################................|
||
|##################################................|

我能用\r或\b做什么?

所以我很好地包装了以前的代码,下面是我最后得到的结果


我使用了一点
oop
概念并模拟了
ProgressBar
的类。下面是我如何为
ProgressBar
设计代码的:

struct tagProgressBarData
{
    unsigned long nMaxLen;
    unsigned long nCurLen;

    char FillChr;
    char EmptyChr;
    char LeftMargin;
    char RightMargin;
};
typedef struct tagProgressBarData PBD;

void InitProgressBar(PBD* p, unsigned long MaxLen, char Left, char Right, char Fill, char Empty);
void DrawProgressBar(PBD* p);
在跳转到
InitProgressBar()
DrawProgressBar()
的定义之前,您应该这样使用我所做的。以下是一个例子:

int main()
{
    PBD data;

    /** You can chose other characters and change the length too! */
    InitProgressBar(&data, 50, '[', ']', '#', '.');

    /** Now we do something which takes some time. */
    /** Let's just calculate some random cubes. */

    /** The N you talked about. */
    unsigned int N;
    printf("How many numbers to compute: ");
    scanf("%u", &N);

    printf("Calculating the cubes of the first %u numbers.\n", N);
    DrawProgressBar(&data);

    for(unsigned int i = 1; i <= N; i++)
    {
        unsigned int CubeResult = i*i*i;

        unsigned long nProgress = ( ((unsigned long long)i) * data.nMaxLen) / N;
        if (nProgress != data.nCurLen)
        {
            data.nCurLen = nProgress;
            DrawProgressBar(&data);
        }
    }


    return 0;
}

如果您想在进度条前但在同一行上有一些文本(如
进度:[代码]或[code>),则必须替换
printf(“\r”)DrawProgressBar()
中使用
for
循环进行编码>,以便准确地向后移动进度条的长度


另外,您还需要一些变量(比如说
bDrawn
),它会告诉您进度条是否至少绘制过一次,这样for循环就不会将光标移动到进度条左侧的现有文本上。

因此,我很好地包装了之前的代码,最后就是这样


我使用了一点
oop
概念并模拟了
ProgressBar
的类。下面是我如何为
ProgressBar
设计代码的:

struct tagProgressBarData
{
    unsigned long nMaxLen;
    unsigned long nCurLen;

    char FillChr;
    char EmptyChr;
    char LeftMargin;
    char RightMargin;
};
typedef struct tagProgressBarData PBD;

void InitProgressBar(PBD* p, unsigned long MaxLen, char Left, char Right, char Fill, char Empty);
void DrawProgressBar(PBD* p);
在跳转到
InitProgressBar()
DrawProgressBar()
的定义之前,您应该这样使用我所做的。以下是一个例子:

int main()
{
    PBD data;

    /** You can chose other characters and change the length too! */
    InitProgressBar(&data, 50, '[', ']', '#', '.');

    /** Now we do something which takes some time. */
    /** Let's just calculate some random cubes. */

    /** The N you talked about. */
    unsigned int N;
    printf("How many numbers to compute: ");
    scanf("%u", &N);

    printf("Calculating the cubes of the first %u numbers.\n", N);
    DrawProgressBar(&data);

    for(unsigned int i = 1; i <= N; i++)
    {
        unsigned int CubeResult = i*i*i;

        unsigned long nProgress = ( ((unsigned long long)i) * data.nMaxLen) / N;
        if (nProgress != data.nCurLen)
        {
            data.nCurLen = nProgress;
            DrawProgressBar(&data);
        }
    }


    return 0;
}

如果您想在进度条前但在同一行上有一些文本(如
进度:[代码]或[code>),则必须替换
printf(“\r”)DrawProgressBar()
中使用
for
循环进行编码>,以便准确地向后移动进度条的长度


此外,您还需要一些变量(比如说
bDrawn
),它将告诉您进度条是否至少绘制过一次,以便for循环不会将光标移动到进度条左侧的现有文本上。

我也这样做了,但似乎非常依赖于项目的数量

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <time.h>

int MAX_PROGRESS = 100;
int BAR_LENGTH = 0;  // Length of Header
int num_items = 30;

void delay(int milliseconds) { 

  // Storing start time 
  clock_t start_time = clock(); 

  // looping till required time is not achieved 
  while (clock() < start_time + milliseconds); 
} 

void initialiseProgressBar(char left, char right, char fill) {

  printf("%c", left);
  for (int i = 0; i < BAR_LENGTH; i ++) {
    printf("%c", fill);
  }

  /** Print the right first (end of line) and then again the left (start of line)
   * as the \r will be placed over it and rewrite from there resulting in one
   * character less
   */
  printf("%c\r%c", right, left);
}

void drawProgressBar(char c) {

  // Print according to BAR_LENGTH
  for (int i = 0; i < 100; i ++) {
    double progress = (i / BAR_LENGTH) % (MAX_PROGRESS * BAR_LENGTH * num_items);
    if (progress == 0) {
      printf("%c", c);
      delay(25);
    }
    // Redraw the stdout stream to show progressing bar
    fflush(stdout);
  }
}

int main(int argc, char* argv[]) {

  // Header
  char* header = "|<------------- Progress Bar ------------->|\n";
  printf("%s", header);
  BAR_LENGTH = strlen(header) - 3; // Account for newline and right character characters

  initialiseProgressBar('[', ']', '.');
  drawProgressBar('#');

  // Footer -- TODO Find better way to finish this without hard coding
  printf("] COMPLETED\n");
  return 0;
}
#包括
#包括
#包括
#包括
int MAX_PROGRESS=100;
int BAR_LENGTH=0;//收割台长度
int num_项目=30;
无效延迟(整数毫秒){
//存储开始时间
时钟开始时间=时钟();
//循环直到未达到所需时间
while(时钟()<开始时间+毫秒);
} 
void initialiseProgressBar(字符左、字符右、字符填充){
printf(“%c”,左);
对于(int i=0;i

假设您知道要计算的项目数(例如,排序列表、计算不同的内容等),这应该很方便:)。

我也做过这项工作,但似乎非常依赖于