• C

sscanf convert C-strings and floating point in one line

I have the follow C code to read a line from a file "store-data.txt" into a C string "record"
and then I use the sscanf to convert into two strings and a floating point with the format string:
 char format1[] = "%s %s %6.2f" and the file contains

"Royal_Crown  CrownRoyal  35.99"

The problem is it doen't read the floating point correctly while after taking the two strings.
The output was:

Got the record from the file: Royal_Crown  CrownRoyal 35.99
Royal_Crown  CrownRoyal  1.22298e-38

Thanks
------------------ The code:

char field_winename[20];
        char field_producer[20];
        float field_price;

 //
      ifstream infile("store-data.txt");
        infile.getline(record,80);   // read in a line from store-data.txt, into  "record"
        cout << "Got the record from the file: " << record << endl;

        num_words = sscanf(record,format1,field_winename,
                                          field_producer,
                                          &field_price
                          );
LVL 1
zzhang2006ProfessorAsked:
Who is Participating?
 
Infinity08Commented:
Just use %f instead of %6.2f. The latter is not valid for sscanf.
0
 
evilrixSenior Software Engineer (Avast)Commented:
Why not read the line into a std::string rather than a char array? Once it's in the string use the string to initialise an istringstream and then read the specific values of from that.

http://www.cplusplus.com/reference/iostream/istringstream/
http://www.cplusplus.com/reference/string/getline/
http://www.cplusplus.com/reference/string/string/


//Untested example
string line;

ifstream infile("store-data.txt");
getline(infline, line);
istringstream ss(line);

string field_winename;
string field_producer;
float field_price;

ss >> field_winename;
ss >> field_producer;
ss >> field_price;

Open in new window

0
 
Jaime OlivaresSoftware ArchitectCommented:
try with this:
char format1[] = "%[^ ]s %[^ ]s %6.2f"
0
How do you know if your security is working?

Protecting your business doesn’t have to mean sifting through endless alerts and notifications. With WatchGuard Total Security Suite, you can feel confident that your business is secure, meaning you can get back to the things that have been sitting on your to-do list.

 
evilrixSenior Software Engineer (Avast)Commented:
BTW are you away you only put this in the C zone but you are using C++ constructs? Would you like that zone added?
0
 
Jaime OlivaresSoftware ArchitectCommented:
the question is very clear: sscanf convert C-strings and floating point in one line
So, it is a C-Language question, although other portions of the code are C++ related.
0
 
evilrixSenior Software Engineer (Avast)Commented:
>> although other portions of the code are C++ related.
Meaning it *is* C++ code meaning we *can* look at exploring C++ solutions. Thanks for telling a Zone Advisor how to do his job.
0
 
zzhang2006ProfessorAuthor Commented:
Thank you all!
Intinity08's solution worked and I will try Jaime's too.

That's all I need for now
0
 
zzhang2006ProfessorAuthor Commented:
thank again
0
 
Infinity08Commented:
jaime_olivares' post would help if the first two tokens (the strings) can contain spaces. It would not solve the problem with the floating point value though. ie. it's solving a different problem than the one you're having.

Do look into what evilrix suggested though. Using std::string's is easier and safer in most cases.
0
 
Infinity08Commented:
>> jaime_olivares' post would help if the first two tokens (the strings) can contain spaces.

Correction : that's not true. I misread what jaime_olivares suggested. Using %[^ ] allows the first two tokens to contain tabs, not spaces ;) On the condition that you use %[^ ] and not %[^ ]s ...
0
 
Jaime OlivaresSoftware ArchitectCommented:
:)
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.