Solved

CFile ...

Posted on 2002-05-20
10
443 Views
Last Modified: 2006-11-17
Hi Experts,

This is what i'm tryting to...

CFile f;
CString fName = "C:\\Test\\test.txt";
int fsize;
char buff[20];
unsigned long mylong;

f.Open(fName, CFile::modeRead, NULL);
fsize = myFile.GetLength();
f.Read(buff, fsize);
mylong = atol(buff);

Note:  test.txt contains a long value of more than 10 digits (e.g. 2523223232)

The question is, why when i print out mylong the another file, it gave me a negative number?

This is how i printed out...

FILE *fp
fp = fopen(filename,"w+");
fprintf (fp, "Test value = %ld\n", mylong);

Please help. Thanks!

TommyN14

0
Comment
Question by:TommyN14
10 Comments
 
LVL 30

Accepted Solution

by:
Axter earned 30 total points
ID: 7022610
You're using an unsigned long to print to a long symbol in the prinf statement.

Try the following:
fprintf (fp, "Test value = %ul\n", mylong);
0
 
LVL 1

Author Comment

by:TommyN14
ID: 7022634
Hi Axter,

I tried that and now i get an extra "1" at the end.  For example, from my above example, now i get
25232232321.  Do you have any idea?

TommyN14
0
 
LVL 30

Expert Comment

by:Axter
ID: 7022704
Ooops!!!
Try the following instead:
printf("Test value = %u\n", mylong);
0
 
LVL 30

Expert Comment

by:Axter
ID: 7022707
Example:
fprintf (fp, "Test value = %u\n", mylong);

What you saw at the end was not a 1, but an 'l' (L).

I forgot to remove it.
0
 
LVL 1

Author Comment

by:TommyN14
ID: 7022737
Hi Axter,

Great!!!  But this is not work for a number MORE THAN 10 digits.  For example 25232232324564.

Maybe i have to use double instead of long?  and what is the % should i use for double or unsigned double?

Thanks for your quick responsed.

TommyN14
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 2

Expert Comment

by:LoungeLizard
ID: 7023159
The problem is that a unsigned long is 4 bytes long (under windows - might be different for other OS's), so that means it can only handle values up to 4294967296. You could go for unsigned double, which will give you 8 bytes i.e. values up to (roughly) 1.84467E+19. Then you would use something like:

fprintf (fp, "Test value = %-20.0f\n", mylong);

If you want more than that, you would need to go to custom multi-precision "variables" which can handle almost (depending on memory) any mount of digits. But that's another kettle of fish altogether...
0
 
LVL 2

Expert Comment

by:mirtol
ID: 7023673
For a double you need %lf

Your not quite right about the above limits, you should look up the following help sections for your compiler:

Data Types
printf Format specifiers

But in general:
long
4 byte
-2,147,483,648 to 2,147,483,647

float (7 digit prec)
4 byte
1.18x10^-38 to 3.40x10^38

double (15 digit prec)
8 byte
2.23x10^-308 to 1.79x10^308

long double (18 digit prec)
10 byte
3.37x10^-4932 to 1.18x10^4932
0
 
LVL 1

Author Comment

by:TommyN14
ID: 7024320
Thanks experts.  I'd like to have pts split out to 2 experts (Axter 30 pts and mirtol 20 pts).  How do i do that?
0
 
LVL 3

Expert Comment

by:Crius
ID: 7024351
LoungeLizard has it close enough. An unsigned long can actually only hold numbers up to 4294967295, but that's only 1 off of what he said (Remember 0 is a number, and it's 4294967296 different values, so 4294967296 - 1).

We were talking about unsigned long, so we take the negatives and add them to the positives.

If you are going to be working with huge integers, I recommend making your own custom storage class for the large numbers. Switching to doubles or floats can lead to inaccuracies, especially with the larger or smaller numbers.

Try breaking up the number at every 9 digit interval. Since you have it in a string, that's not going to be too difficult. Once you have done this, parse each 9 digit section individually into its own variable, and remember which variable is the most significant. You could patch together many variables like this, maybe in an array.

I have written the following sample program to better explain my point:

void main()
{
    int NumOfVariablesInArray;
    long *DynLongArray;
    int SizeOfBuff;
    char buff[20] = "1234567890123";
    char *buffptr;
    int arrayPos;

    //Allocate memory
    SizeOfBuff = strlen(buff);  //Assuming buff is already read in
    NumOfVariablesInArray = SizeOfBuff/9+1;
    DynLongArray = (long *)malloc(NumOfVariablesInArray*sizeof(long));  //Could use calloc too
    if(!DynLongArray)
    {
     printf("Out of memory. Since we didn't request much (did we?) this is really bad. Does this look normal:%s?", buff);
     return;
    }

    //Start filling DynLongArray with the values
    buffptr = buff+SizeOfBuff;
    arrayPos = NumOfVariablesInArray;
    while(buffptr-9>buff)
    {
     buffptr-=9;
     arrayPos--;
     sscanf(buffptr, "%i", DynLongArray+arrayPos);
     *buffptr = 0;
    }
    sscanf(buff, "%i", DynLongArray);

    //Now prove we have stored it properly
    printf("I have stored this number:\n");
    for(int i = 0; i<NumOfVariablesInArray; i++)
     printf("%i",DynLongArray[i]);

    //Free memory
    free(DynLongArray);
}
0
 
LVL 1

Expert Comment

by:Moondancer
ID: 7024520
Per your request, I have split points for you.
Points for mirtol -> Please comment here for your share:
http://www.experts-exchange.com/jsp/qShow.jsp?qid=20303133
Moondancer - EE Moderator
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Article by: SunnyDark
This article's goal is to present you with an easy to use XML wrapper for C++ and also present some interesting techniques that you might use with MS C++. The reason I built this class is to ease the pain of using XML files with C++, since there is…
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

863 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

27 Experts available now in Live!

Get 1:1 Help Now