Jump to content

  • Log In with Google      Sign In   
  • Create Account

Banner advertising on our site currently available from just $5!


1. Learn about the promo. 2. Sign up for GDNet+. 3. Set up your advert!


better way to extract number from string?


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 Kevn   Members   -  Reputation: 163

Like
1Likes
Like

Posted 23 January 2012 - 02:06 PM

Hey, I was wondering if there is a better/more efficient way of going about extracting any number that follows 'i' in a file. So lets say the document has the following content : "Hello, this is a random document... try to extract i1 i34 i405 i2 from this document". So by the end of the extraction you would have the numbers 1, 34, 405, and 2.

The way I am currently doing it is:
string filename, line;
int test = 0;
ifstream infile(filename);
if (!infile){
	cout << "Could not open file" << endl;
	return 1;
}
while (getline(infile, line))
{
	for (string::iterator it = line.begin(); it < line.end(); it++)
	{
		 if (*it == 'i'){
			  it++;
			  test = 0;
			  while (*it > 47 && *it < 58){
					test = test * 10;
					test = test + (*it - '0');
					it++;
				}
				cout << test << " ";
				it--;
			}
	  }
}
infile.close();


Sponsor:

#2 fastcall22   Crossbones+   -  Reputation: 4863

Like
1Likes
Like

Posted 23 January 2012 - 02:20 PM

ifstream fs( "test.txt" );
if ( !fs )
    return;

fs.seekg( 0, ios::end );
int sz = fs.tellg();
fs.seekg( 0, ios::beg );

char* file = new char[sz];
in.read( file, sz );

vector<int> data;
char* current = file;
char* previous = file;
char* end = file + sz;
int i;
while ( current < end ) {
    previous = current;
    i = strtol( current, &current, 10 );
    if ( previous == current )
        current ++;
    else
        data.push_back( i );
}

delete[] file;
</int>

EDIT:
Oops, didn't see that the integers needed to be prefixed with 'i'.
QWxsIHRvYXN0LXRvYXN0aW5nIHRvYXN0ZXJzIGNhbiB0b2FzdCB0b2FzdGVkIHRvYXN0LCBhbHRob3Vn aCByZS10b2FzdGluZyB0b2FzdGVkIHRvYXN0IGlzIGdlbmVyYWxseSBub3QgcmVjb21tZW5kZWQgYnkg dGhlIG1hbnVmYWN0dXJlcnMgb2YgdG9hc3QtdG9hc3RpbmcgdG9hc3RlcnMuLi4=

#3 SiCrane   Moderators   -  Reputation: 9849

Like
5Likes
Like

Posted 23 January 2012 - 02:22 PM


  while (infile) {

    std::istream::int_type c = infile.get();

    if (c == 'i') {

      std::istream::int_type next = infile.peek();

      if (isdigit(next)) {

        int i;

        infile >> i;

        std::cout << i << std::endl;

      }

    }

  }



#4 Kevn   Members   -  Reputation: 163

Like
0Likes
Like

Posted 23 January 2012 - 03:40 PM

Awesome, thank you!




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS