pupuboo
asked on
How to use sscanf
Hi ,
I need to read in a txt file with below syntax:
#
# This is text file:
#
# color : number : exist : [OLD_STUFF]
#
PRODUCT: abc
orange : 230 : 1,4,6,8,11,44-67,88
purple : 127 : 3,9,22,55-77,99 : OLD_STUFF
PRODUCT: xyz
white : 230 : 1,4,6,8,11,88
black : 130 : 3,9,22,99 : OLD_STUFF
blue : 679 : 0-11, 100-237, 239
1. how to write sscanf to read in a file that generic enough,
if see "#" , no process
no "#", further process
2. if further process.
how to write generic sscanf to read data from "orange : 230 : 1,4,6,8,11,44-67,88" and "black : 130 : 3,9,22,99 : OLD_STUFF"
I need to read in a txt file with below syntax:
#
# This is text file:
#
# color : number : exist : [OLD_STUFF]
#
PRODUCT: abc
orange : 230 : 1,4,6,8,11,44-67,88
purple : 127 : 3,9,22,55-77,99 : OLD_STUFF
PRODUCT: xyz
white : 230 : 1,4,6,8,11,88
black : 130 : 3,9,22,99 : OLD_STUFF
blue : 679 : 0-11, 100-237, 239
1. how to write sscanf to read in a file that generic enough,
if see "#" , no process
no "#", further process
2. if further process.
how to write generic sscanf to read data from "orange : 230 : 1,4,6,8,11,44-67,88" and "black : 130 : 3,9,22,99 : OLD_STUFF"
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
btw are you sure you have to use sscanf ? cos sscanf cannot read directlyfrom a file .. its reads only from a buffer .
I think reading the line first and then deciding how to process is probably cleaner - certainly more flexible, but if you really want to scanf...
The following code produces this output:
Color: orange, #230, 1,4,6,8,11,44-67,88
Color: purple, #127, 3,9,22,55-77,99, OLD_STUFF
Color: white, #230, 1,4,6,8,11,88
Color: black, #130, 3,9,22,99, OLD_STUFF
Color: blue, #679, 0-11,
-------------------------- ---------- ---------- ----
FILE *stream = fopen(filename, "r");
char color[32], exist[32], stuff[32];
long number;
int numFields = 0;
while ( (numFields = fscanf(stream, "%s : %d : %s :%s", color, &number, exist, stuff)) > 0)
{
if ( numFields > 1 )
{
std::cout << "Color: " << color << ", #" << number << ", " << exist;
if ( numFields > 3 ) std::cout << ", " << stuff;
std::cout << std::endl;
}
}
The following code produces this output:
Color: orange, #230, 1,4,6,8,11,44-67,88
Color: purple, #127, 3,9,22,55-77,99, OLD_STUFF
Color: white, #230, 1,4,6,8,11,88
Color: black, #130, 3,9,22,99, OLD_STUFF
Color: blue, #679, 0-11,
--------------------------
FILE *stream = fopen(filename, "r");
char color[32], exist[32], stuff[32];
long number;
int numFields = 0;
while ( (numFields = fscanf(stream, "%s : %d : %s :%s", color, &number, exist, stuff)) > 0)
{
if ( numFields > 1 )
{
std::cout << "Color: " << color << ", #" << number << ", " << exist;
if ( numFields > 3 ) std::cout << ", " << stuff;
std::cout << std::endl;
}
}
You should note that the fscanf is fragile. If the input lines are not all formatted alike, it won't work.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.