472,791 Members | 1,514 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,791 software developers and data experts.

printf not printing

179 100+
I'm having a little trouble with a progress bar that I've got in C++. This works fine in Windows but is not working correctly in Linux, and I'm wondering if anyone can help?

Expand|Select|Wrap|Line Numbers
  1.  
  2. const char DONE = '=';                                               
  3. const char BLANK = ' ';
  4. const unsigned INCREMENT = 3;
  5. static char progressB[(100 / INCREMENT ) + INCREMENT ] = "[                                 ]";
  6.  
  7. void progress(unsigned int current, char* msg)
  8.     // Work out how many blocks are empty and full
  9.     unsigned int blocks = current / INCREMENT;
  10.     unsigned int remaining = 100 / INCREMENT; 
  11.     unsigned int i = 0;
  12.  
  13.     // All the 'DONE' blocks on progress bar
  14.     while( i < blocks)
  15.         progressB[++i] = DONE;
  16.  
  17.     // All the 'TO-DO' blocks on progress bar
  18.     while(i < remaining)
  19.         progressB[++i] = BLANK;
  20.  
  21.     // We print the percentage before the progress bar, but we 
  22.     // don't want the bar jigging around as the number of digits
  23.     // change so adjust the number of spaces we use.
  24.     if (current < 10)
  25.         printf("   %u%% ", current);
  26.     else if (current == 100)
  27.         printf(" %u%% ", current);
  28.     else 
  29.         printf("  %u%% ", current);
  30.  
  31.     // Print the progress bar
  32.     printf( "%30s", progressB);
  33.     // Print the message (e.g. What action are we doing?)
  34.     printf(msg);
  35.     // Carriage return, so we can re-print the progress bar next time around
  36.     printf("\r");
  37. }
  38.  
The output in windows gives a nice bar filling up with = signs. In Linux I don't get any output whatsoever... unless.

If I add "cout << endl;" before or after this function gets called then it starts printing out the progress bar. If I use cout without an std::endl then I still get no output. Obviously introducing the endl is bad however because my progress bar then looks like so:

0% [ ]Import File
9% [=== ] Importing File
18% [====== ] Importing File

On seperate lines. Any help to figure out why this is happening would be much appreciated.

Thanks!
Feb 22 '08 #1
3 10477
IanWright
179 100+
I always seem to answer my own question on here... Search for a solution, run out of ideas, make a post, then find the problem!

I've basically discovered that unlike windows, linux doesn't seem to flush the output to screen very well. I tried a larger sample and wrote just a little progress bar loop, and found that windows would update 100x (1 for each percentage), yet linux would update about 4x (35%, 57%, 73%, 99%) as an example.

Having a read, I discovered that endl also flushes the output. So I tried

Expand|Select|Wrap|Line Numbers
  1. flush(cout);
  2.  
And it now updates and actually draws on screen regularly! Maybe someone with a bit more expertise could explain why this is the case? And why windows and Linux doesn't seem to behave the same way with the same code?
Feb 22 '08 #2
weaknessforcats
9,208 Expert Mod 8TB
Stop using printf() in C++.

When you:
Expand|Select|Wrap|Line Numbers
  1.  
  2. os << data;
  3.  
  4.  
The os can be any ostream: stdout, a diosc file, the network. If you are using the insertion operator your code can direct it's output to any output stream. printf() can't. You have to chnage the code and uses fprintf(), etc. Plus this turkey can only use the built-in types. That is, no way printf() can display your Date object as 02/22/2008. However, a << overload in your Date class can.

Windows doesn't flush the output buffer any better than Windows does. endl is a function pointer and if you don't use the endl in Windows your buffer may not be flushed either.

endl looks like:
Expand|Select|Wrap|Line Numbers
  1. ostream& endl(ostream& os)
  2. {
  3.        os.put('\n');
  4.        os.flush();
  5.  
  6. }
  7.  
Feb 22 '08 #3
IanWright
179 100+
weaknessforcats,

Thanks for the reply. I'll try to stop using printf(). I didn't realise it was deprecated before hand as I was using g++ for compiling and using previous examples I have lying around. I'll endeavour not to use it in the future.

Ian
Feb 26 '08 #4

Sign in to post your reply or Sign up for a free account.

Similar topics

8
by: scrodchunk | last post by:
I'm having a weird problem with printing bytes in hex format. I have a bunch of print statements that are working okay, then using the identical formatting later in my code I get some thing where...
7
by: teachtiro | last post by:
Hi, 'C' says \ is the escape character to be used when characters are to be interpreted in an uncommon sense, e.g. \t usage in printf(), but for printing % through printf(), i have read that %%...
188
by: infobahn | last post by:
printf("%p\n", (void *)0); /* UB, or not? Please explain your answer. */
25
by: Joakim Hove | last post by:
Hello, I have code which makses use of variables of type size_t. The code is originally developed on a 32 bit machine, but now it is run on both a 32 bit and a 64 bit machine. In the code...
27
by: jacob navia | last post by:
Has anyone here any information about how arrays can be formatted with printf? I mean something besides the usual formatting of each element in a loop. I remember that Trio printf had some...
8
by: manochavishal | last post by:
Hi, I have a structure MAX_ID is 5 /**Structure for Copies*/ typedef struct NodeVideoCopy * NodeVideoCopyPtr ; typedef struct NodeVideoCopy {
17
by: arindam.mukerjee | last post by:
I was running code like: #include <stdio.h> int main() { printf("%f\n", 9/5); return 0; }
0
by: sabya123 | last post by:
I have got a problem using printf and wprintf. Can I use them simultaneously in a single program? My problem is that, If I am using both of them in a program only the first one is being taken....
14
by: yashwant pinge | last post by:
The following statement printf("%d %c"); gives the garbage value Why it is...?
3
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 2 August 2023 starting at 18:00 UK time (6PM UTC+1) and finishing at about 19:15 (7.15PM) The start time is equivalent to 19:00 (7PM) in Central...
0
by: erikbower65 | last post by:
Using CodiumAI's pr-agent is simple and powerful. Follow these steps: 1. Install CodiumAI CLI: Ensure Node.js is installed, then run 'npm install -g codiumai' in the terminal. 2. Connect to...
0
linyimin
by: linyimin | last post by:
Spring Startup Analyzer generates an interactive Spring application startup report that lets you understand what contributes to the application startup time and helps to optimize it. Support for...
0
by: erikbower65 | last post by:
Here's a concise step-by-step guide for manually installing IntelliJ IDEA: 1. Download: Visit the official JetBrains website and download the IntelliJ IDEA Community or Ultimate edition based on...
0
by: Taofi | last post by:
I try to insert a new record but the error message says the number of query names and destination fields are not the same This are my field names ID, Budgeted, Actual, Status and Differences ...
14
DJRhino1175
by: DJRhino1175 | last post by:
When I run this code I get an error, its Run-time error# 424 Object required...This is my first attempt at doing something like this. I test the entire code and it worked until I added this - If...
0
by: lllomh | last post by:
Define the method first this.state = { buttonBackgroundColor: 'green', isBlinking: false, // A new status is added to identify whether the button is blinking or not } autoStart=()=>{
0
by: lllomh | last post by:
How does React native implement an English player?
0
by: Mushico | last post by:
How to calculate date of retirement from date of birth

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.