Question

I am reading in a file into an array. It is reading each char, the problem arises in that it also reads a newline in the text file.

This is a sudoku board, here is my code for reading in the char:

bool loadBoard(Square board[BOARD_SIZE][BOARD_SIZE])
{
  ifstream ins;

  if(openFile(ins)){

    char c;

    while(!ins.eof()){
      for (int index1 = 0; index1 < BOARD_SIZE; index1++)
        for (int index2 = 0; index2 < BOARD_SIZE; index2++){ 
          c=ins.get();

          if(isdigit(c)){
            board[index1][index2].number=(int)(c-'0');
            board[index1][index2].permanent=true;
          }
        }
    }

    return true;
  }

  return false;
}

like i said, it reads the file, displays on screen, just not in correct order when it encounters the \n

Was it helpful?

Solution

Well in your file format you can simply not save newlines, or you can add a ins.get() the for loop.

You could also wrap your c=ins.get() in a function something like getNextChar() which will skip over any newlines.

I think you want something like this:

 for (int index1 = 0; index1 < BOARD_SIZE; index1++)
 {
  for (int index2 = 0; index2 < BOARD_SIZE; index2++){

   //I will leave the implementation of getNextDigit() to you
   //You would return 0 from that function if you have an end of file
   //You would skip over any whitespace and non digit char.
   c=getNextDigit();
   if(c == 0)
     return false;

   board[index1][index2].number=(int)(c-'0');
   board[index1][index2].permanent=true;
  }
 }
 return true;

OTHER TIPS

You can put you ins.get() in a do while loop:

do { 
    c=ins.get();
} while(c=='\n');

You have a few good options. Either don't save the newline in the file, explicitly discard them in your loop, or use std::getline() in <string>.

For example, using getline():

#include <string>
#include <algorithm>
#include <functional>
#include <cctype>

using namespace std;

// ...

string line;
for (int index1 = 0; index1 < BOARD_SIZE; index1++) {
    getline(is, line); // where is is your input stream, e.g. a file
    if( line.length() != BOARD_SIZE )
        throw BabyTearsForMommy();
    typedef string::iterator striter;
    striter badpos = find_if(line.begin(), line.end(),
                             not1(ptr_fun<int,int>(isdigit)));
    if( badpos == line.end() )
        copy(board[index1], board[index1]+BOARD_SIZE, line.begin());
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top