[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 682
  • Last Modified:

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
                          );
0
zzhang2006
Asked:
zzhang2006
  • 3
  • 3
  • 3
  • +1
2 Solutions
 
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
 
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
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 
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
 
Infinity08Commented:
Just use %f instead of %6.2f. The latter is not valid for sscanf.
0
 
zzhang2006Author Commented:
Thank you all!
Intinity08's solution worked and I will try Jaime's too.

That's all I need for now
0
 
zzhang2006Author 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

Featured Post

Take Control of Web Hosting For Your Clients

As a web developer or IT admin, successfully managing multiple client accounts can be challenging. In this webinar we will look at the tools provided by Media Temple and Plesk to make managing your clients’ hosting easier.

  • 3
  • 3
  • 3
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now