954,506 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Remove extra whitespace

Hello all,

I am working on a program that takes input from a file, removes extra white spaces and outputs the edited text to another file.

So far my program deletes 1 whitespace whether the whitespace should be deleted or not.

I have read about peek() and putback(). I am pretty sure I need to implement these two functions but quite frankly I am not sure how to go about doing this.

I don't want anyone to just give me the answer I would really appreciate it if someone gave me a hint as to where my logic went south or my structure or enlighten me about some predefined function you think I may not be aware of.

Any help is appreciated. Thank you.
-Arielle

#include <iostream>
#include <iomanip>
#include <fstream>
#include <cstdlib>

using namespace std;
void check_blank(ifstream& instream, ofstream& outstream);
int number = 0; //keeps track of how many spaces have been deleted

int main() 
{
  ifstream instream;
  ofstream outstream;
  bool     t;
  
  instream.open("hw4pr6input.txt");         //Open file: text to be edited
  if(!instream.fail())                      //Make sure file opened successfully
  {
  cout << "test from open";
     //Call function that finds blanks and edits
  }
  else
  {
    cout << "File failed to open (1st)";
    exit(1);
  }
  
  outstream.open("hw4pr6output.txt");       //Open file: edited text will go
  if(!outstream.fail())                     //Check if open failed
  {
   t = true;   
   check_blank(instream, outstream);              //Call function to input edited text into file
  }
  else
  {
    cout << "File failed to open (2nd)";
    exit(1);  
  }
  
  cout << "Removed " << number              
       << " blanks from file" 
       << endl;
  
  system("PAUSE");
  instream.close();                         //Close both files
  outstream.close();
  
  return 0;
}                                                  //End main

void check_blank(ifstream& instream, ofstream& outstream)
{
  char a;
                                         
  int count  = 0;                               //Variable tells if there are multiple blank spaces

  while(! instream.eof())                  //While the file isn't at the end
   {
     instream.get(a);
     if(a == ' ')                                 //If the input is a space
     {
          number++;  
          count++;
                                                     //Add 1 to number & count
          if(a == ' ' && count >= 2)      //If there are 2 or more spaces then do this
          {
             outstream << ' ';
             count = 0;                         //reset count
          }  //end inner if
     }   //end outer if    
     else
     {
       outstream << a;  
     }
     
   }//end while
}//end check function


This is my input
hw4pr6input.txt

This is my current output
hw4pr6output.txt

Attachments hw4pr6input.txt (0.72KB) hw4pr6output.txt (0.65KB)
Squeeker
Newbie Poster
16 posts since Feb 2008
Reputation Points: 33
Solved Threads: 0
 

why don't you do this the easy way by using the ifstream >> operator to remove all white space between words with output the word just read with one space

string word;
while( infile >> word)
   outfile << word << " ";
Ancient Dragon
Retired & Loving It
Team Colleague
30,049 posts since Aug 2005
Reputation Points: 5,662
Solved Threads: 2,343
 
iamthwee
Posting Expert
5,950 posts since Aug 2005
Reputation Points: 1,543
Solved Threads: 439
 

why don't you do this the easy way by using the ifstream >> operator to remove all white space between words with output the word just read with one space

string word;
while( infile >> word)
   outfile << word << " ";


Like Larry Wall said:

"Make simple things easy."

SpS
Posting Pro
599 posts since Aug 2005
Reputation Points: 70
Solved Threads: 32
 

>Make simple things easy.

Here, here. But what about the newlines and/or tabs?

iamthwee
Posting Expert
5,950 posts since Aug 2005
Reputation Points: 1,543
Solved Threads: 439
 

>But what about the newlines and/or tabs?
Indeed. And what about such monstrosities as "\t \n\n\t"? Does "extra whitespace" refer to adjacent whitespace characters of the same value, any value that isspace returns true for, or are we only working with the ' ' character? The problem doesn't seem to be well defined.

>I have read about peek() and putback().
Unnecessary. You can save the last character read from the stream and use it as a state to process the next character:

char last = 0;
char ch;

while ( in.get ( ch ) ) {
  if ( ch == ' ' && last == ' ' )
    continue;

  out.put ( ch );
  last = ch;
}

A good rule of thumb is that if you think you need to peek or putback on a stream, you probably need to improve your design.

Narue
Bad Cop
Administrator
15,460 posts since Sep 2004
Reputation Points: 6,464
Solved Threads: 1,401
 

tabs are considered white space so they are treated just like spaces. But you (jamthwee) are correct about newlines, so my previous suggestion will not work. But there is hope. Use getline() to read the entire line then stringstream to split it up into individual words similar to what I posted before. I was about to post the solution, but then I would be doing the OPs homework for him wouldn't I ?

Ancient Dragon
Retired & Loving It
Team Colleague
30,049 posts since Aug 2005
Reputation Points: 5,662
Solved Threads: 2,343
 

Thank you for all the pointers everyone. I really appreciate it.
-Arielle

Squeeker
Newbie Poster
16 posts since Feb 2008
Reputation Points: 33
Solved Threads: 0
 

This question has already been solved

Post: Markdown Syntax: Formatting Help
You