Thread: Read from text file to a string

  1. #16
    Apprentice
    Join Date
    Oct 2006
    Location
    LA
    Posts
    53
    If the whole string is a white space, my startPos will be 0 and endPos(length of string) will be -1. Wouldn't that truncate the string to an empty string? Or am I missing something here?

  2. #17
    C++ Witch laserlight's Avatar
    Join Date
    Oct 2003
    Location
    Singapore
    Posts
    28,412
    Quote Originally Posted by lazyme
    If the whole string is a white space, my startPos will be 0 and endPos(length of string) will be -1.
    Actually, it will be std::string::npos, which is not -1, even though it is equal to -1 converted to std::string::size_type, which is an unsigned integer type.

    Quote Originally Posted by lazyme
    Wouldn't that truncate the string to an empty string? Or am I missing something here?
    No. It would get the substring of the string from the character at index 0 to the last character of the string.

    By the way, why did you not test before asking?
    Quote Originally Posted by Bjarne Stroustrup (2000-10-14)
    I get maybe two dozen requests for help with some sort of programming or design problem every day. Most have more sense than to send me hundreds of lines of code. If they do, I ask them to find the smallest example that exhibits the problem and send me that. Mostly, they then find the error themselves. "Finding the smallest program that demonstrates the error" is a powerful debugging tool.
    Look up a C++ Reference and learn How To Ask Questions The Smart Way

  3. #18
    Apprentice
    Join Date
    Oct 2006
    Location
    LA
    Posts
    53
    Sorry, I just got a bit confused.
    I have made changes to my function and I think this should work fine even when the whole string is a whitespace.

    Code:
    if(endPos!=std::string::npos)
    {
    	endPos = (endPos+1)-startPos;
    }
    else
    {
    	endPos = 0;
    }

  4. #19
    C++ Witch laserlight's Avatar
    Join Date
    Oct 2003
    Location
    Singapore
    Posts
    28,412
    Quote Originally Posted by lazyme
    I have made changes to my function and I think this should work fine even when the whole string is a whitespace.
    It looks correct now, but you should test.

    Now, notice that if std::string::npos is returned by find_first_not_of, it will also be be returned by find_last_not_of. This suggests that you can handle the case of a string consisting only of whitespace separately, and thus simplify your code.
    Quote Originally Posted by Bjarne Stroustrup (2000-10-14)
    I get maybe two dozen requests for help with some sort of programming or design problem every day. Most have more sense than to send me hundreds of lines of code. If they do, I ask them to find the smallest example that exhibits the problem and send me that. Mostly, they then find the error themselves. "Finding the smallest program that demonstrates the error" is a powerful debugging tool.
    Look up a C++ Reference and learn How To Ask Questions The Smart Way

  5. #20
    Apprentice
    Join Date
    Oct 2006
    Location
    LA
    Posts
    53
    Does this code look better?

    Code:
    void trim( std::string& strToBeFormatted )
    {
    	size_t startPos = strToBeFormatted.find_first_not_of("\n\t ");
    	size_t endPos = strToBeFormatted.find_last_not_of("\n\t ");
    
    	if(startPos==std::string::npos)
    	{
    		startPos = 0;
    		endPos = 0;
    	}
    	else
    	{
    		endPos = (endPos+1)-startPos;
    	}
    
    	strToBeFormatted = strToBeFormatted.substr( startPos, endPos );
    }

  6. #21
    C++ Witch laserlight's Avatar
    Join Date
    Oct 2003
    Location
    Singapore
    Posts
    28,412
    What I had in mind:
    Code:
    void trim(std::string& subject)
    {
        if (!subject.empty())
        {
            std::string::size_type startPos = subject.find_first_not_of("\n\t ");
            if (startPos != std::string::npos)
            {
                std::string::size_type endPos = subject.find_last_not_of("\n\t ");
                subject = subject.substr(startPos, endPos - startPos + 1);
            }
            else
            {
                subject.clear();
            }
        }
    }
    Quote Originally Posted by Bjarne Stroustrup (2000-10-14)
    I get maybe two dozen requests for help with some sort of programming or design problem every day. Most have more sense than to send me hundreds of lines of code. If they do, I ask them to find the smallest example that exhibits the problem and send me that. Mostly, they then find the error themselves. "Finding the smallest program that demonstrates the error" is a powerful debugging tool.
    Look up a C++ Reference and learn How To Ask Questions The Smart Way

  7. #22
    Apprentice
    Join Date
    Oct 2006
    Location
    LA
    Posts
    53
    Your code definitely looks much better. I hope with more practice I would start thinking on the same lines and write better code.

    Thanks laserlight

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Newbie homework help
    By fossage in forum C Programming
    Replies: 3
    Last Post: 04-30-2009, 04:27 PM
  2. Basic text file encoder
    By Abda92 in forum C Programming
    Replies: 15
    Last Post: 05-22-2007, 01:19 PM
  3. Replies: 4
    Last Post: 03-03-2006, 02:11 AM
  4. Replies: 1
    Last Post: 09-10-2005, 06:02 AM
  5. System
    By drdroid in forum C++ Programming
    Replies: 3
    Last Post: 06-28-2002, 10:12 PM