473,508 Members | 2,133 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

printf not printing

179 New Member
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 10537
IanWright
179 New Member
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 Recognized Expert Moderator Expert
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 New Member
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
20116
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
96256
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
17200
by: infobahn | last post by:
printf("%p\n", (void *)0); /* UB, or not? Please explain your answer. */
25
36435
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
2941
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
1810
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
2469
by: arindam.mukerjee | last post by:
I was running code like: #include <stdio.h> int main() { printf("%f\n", 9/5); return 0; }
0
2092
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
390
by: yashwant pinge | last post by:
The following statement printf("%d %c"); gives the garbage value Why it is...?
0
7225
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
7124
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
7326
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
7385
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
1
5053
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...
0
3182
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
0
1558
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated ...
1
766
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
0
418
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence...

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.