Problem with stripping white spaces and references!?

Discussion in 'C++' started by delyan.nestorov, Apr 3, 2007.

  1. Hi All,

    I have the following problem:
    I read lines from DXF file ( AutoCAD format file ). Then I need to
    remove white spaces from lines to continue working on data i.e.
    converting from string to int and so on. My StripWhiteSpace function
    works in test program:

    #include <iostream>
    #include <string>
    #include <fstream>

    using namespace std;

    void StripWhiteSpace( string& Destination )
    {
    for( int i = 0, j = Destination.length()-1; i<j; i++) {
    if( Destination == ' ' || Destination == '\t' ) {
    Destination.erase( i, 1 );
    j--;
    }
    }
    }

    bool StringToInt( string& Source, int *Dest )
    {
    cout<<"Calling StringToInt with:"<<Source<<endl;

    unsigned int i = 0;
    bool isNegative = false;

    *Dest = 0;

    if( Source[0] == '-' ) {
    isNegative = true;
    i = 1;
    }

    for( ; i<Source.length(); i++ ) {
    if( Source >= '0' && Source <= '9' ) {
    if( ( i == 0 && isNegative == false ) || ( i == 1 && isNegative ==
    true ) ){
    *Dest = Source - '0';
    }else{
    *Dest = (*Dest)*10 + Source - '0';
    }
    }else{
    return false;
    }
    }

    if( isNegative )
    *Dest = (*Dest)*-1;

    cout<<"(StringToInt): Source:"<<Source<<" Dest: "<<*Dest<<endl;
    return true;
    }

    int main()
    {
    ifstream fin("test.dxf");
    string a;
    while( !fin.eof() ) {
    fin>>a;
    StripWhiteSpace( a );
    cout<<a<<endl;
    }

    return 0;
    }





    but doesn't work in my real program ( part of it below )





    #ifndef DXFFILEREADER_HPP_
    #define DXFFILEREADER_HPP_

    #include <string>
    #include <fstream>
    #include <iostream>
    #include "DXFToken.hpp"

    using namespace std;

    class DXFFileReader
    {
    private:
    ifstream dxfFileStream;
    private:
    void StripWhiteSpace( string& Destination );
    bool StringToInt( string& Source, int *Dest );
    bool GetDXFLine( string& Destination );
    public:
    DXFFileReader( string dxfFileToRead );
    bool IsOpened();
    bool GetDXFToken( DXFToken *dxfToken );
    };

    #endif /*DXFFILEREADER_HPP_*/



    void DXFFileReader::StripWhiteSpace( string& Destination )
    {
    int j = Destination.length();
    for( int i = 0; i<j; i++) {
    if( Destination == ' ' || Destination == '\t' ) {
    Destination.erase( i, 1 );
    j--;
    }
    }
    cout<<"StripWhiteSpace:"<<Destination<<endl;
    }

    bool DXFFileReader::StringToInt( string& Source, int *Dest )
    {
    cout<<"Calling StringToInt with: "<<Source<<endl;
    unsigned int i = 0;
    bool isNegative = false;

    *Dest = 0;

    if( Source[0] == '-' ) {
    isNegative = true;
    i = 1;
    }

    for( ; i<Source.length(); i++ ) {
    if( Source >= '0' && Source <= '9' ) {
    if( ( i == 0 && isNegative == false ) || ( i == 1 && isNegative ==
    true ) ){
    *Dest = Source - '0';
    }else{
    *Dest = (*Dest)*10 + Source - '0';
    }
    }else{
    cout<<"return false: "<<Source<<" string legth:
    "<<Source.length()<<endl;
    cout<<"last char: "<<Source[1]<<endl;
    return false;
    }
    }

    if( isNegative )
    *Dest = (*Dest)*-1;

    cout<<"(StringToInt): Source:"<<Source<<" Dest: "<<*Dest<<endl;
    return true;
    }

    bool DXFFileReader::GetDXFLine( string& Destination )
    {
    if( !dxfFileStream.is_open() || dxfFileStream.eof() )
    return false;

    getline( dxfFileStream, Destination, '\n');
    StripWhiteSpace( Destination );
    cout<<"GetDXFLine: "<<Destination<<endl;

    return true;
    }

    bool DXFFileReader::GetDXFToken( DXFToken *dxfToken )
    {
    string CodeLine, ValueLine;
    int Code = 0;

    if( GetDXFLine( CodeLine ) && GetDXFLine( ValueLine ) ) {
    if( !StringToInt( CodeLine, &Code ) ) {
    return false;
    }else{
    if( Code == 999 ) {
    //This is comment :)
    } else if( (Code >=0 && Code <= 9) ||
    (Code >=300 && Code <= 309) ||
    (Code >=1000 && Code <= 1009) ||
    Code == 100 ||
    Code == 102 ) {
    dxfToken->AssignToken( Code, ValueLine );
    }else if( (Code >=60 && Code <= 79) ||
    (Code >=90 && Code <= 99) ||
    (Code >=170 && Code <= 175) ||
    (Code >=1060 && Code <= 1071) ||
    (Code >=280 && Code <= 289) ) {

    int Value = 0;
    if( !StringToInt( ValueLine, &Value ) )
    return false;

    dxfToken->AssignToken( Code, Value );
    }else{
    return false;
    }
    }
    }else{
    return false;
    }
    return true;
    }



    the output is as follows:

    C:\Documents and Settings\nestorovd\workspace\DXFReader\Debug>"C:
    \Documents and Settings\nestorovd\workspace\DXFReader\Debug
    \DXFReader.exe"
    success openning file
    StripWhiteSpace: 0
    GetDXFLine: 0
    StripWhiteSpace:SECTION
    GetDXFLine: SECTION
    Calling StringToInt with: 0
    return false: string legth: 2
    last char: 0



    What I am doing wrong? Please help!
     
    delyan.nestorov, Apr 3, 2007
    #1
    1. Advertisements

  2. Can't help you with your code but I can give you something else that
    might be usedful, the following code can be used to convert strings to
    a number of types (all the native builtin) even if there are spaces:

    #include <iostream>
    #include <sstream>
    #include <string>

    /*
    * Converts a string to some other type. The type converted to must
    * have a std::eek:stream& operator>>(std::eek:stream&, T) method declared.
    * Works for all built-in types.
    */
    template <class T>
    T stoa(const std::string& s)
    {
    T t;
    std::istringstream iss(s);
    if (!(iss >> t))
    throw std::string("Can't convert '") + s +
    "' to '" + typeid(t).name() + "'\n";
    return t;
    }

    int main()
    {
    std::string s = " -54 ";
    try {
    int d = stoa<int>(s);
    } catch(std::string& s) {
    std::cout << s;
    }
    return 0;
    }

    It's my own adoption of the code from the FAQ:
    http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.2
     
    =?iso-8859-1?q?Erik_Wikstr=F6m?=, Apr 3, 2007
    #2
    1. Advertisements

  3. Erik Wikstrom íàïèñà:
    Hi again,

    Thanks Erik this was usefull for me!

    And I found my STUPID error:

    if( Destination == ' ' || Destination == '\t' ) {
    Destination.erase( i, 1 );
    j--; i--; <----HERE this "i--" missed
    hahaha, horror! Today my head is full with s***s
    }
     
    delyan.nestorov, Apr 3, 2007
    #3
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.