2010-04-01 8 views
5

Ich lese in einer Datei in ein Array. Es liest jedes Zeichen, das Problem entsteht dadurch, dass es auch einen Zeilenumbruch in der Textdatei liest.Needline Char ( n) aus Eingabedatei zu überspringen

Dies ist ein Sudoku-Brett, hier ist mein Code in der char zum Lesen:

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; 
} 

wie ich schon sagte, es liest die Datei, erscheint auf dem Bildschirm, nur nicht in der richtigen Reihenfolge, wenn es die Begegnungen \ n

+0

Tag die Frage, Hausaufgaben, wenn es sich um eine Hausaufgaben Frage ist. – wilhelmtell

Antwort

0

Nun in Ihrem Dateiformat können Sie einfach keine Zeilenumbrüche speichern, oder Sie können eine for.get() for-Schleife hinzufügen.

Sie können auch Ihre c = ins.get() in eine Funktion wie getNextChar() umbrechen, die alle Zeilenumbrüche überspringt.

Ich glaube, Sie so etwas wie dies wollen:

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; 
+0

könnten Sie ein bisschen genauer sein? so ziemlich ein n00b hier. Vielleicht habe ich mich nicht gut erklären - Ich brauche es, um die Zeilenschaltung zu überspringen, wann immer es darauf trifft und nicht auf das Element des Arrays schreiben ... – codefail

+0

@igor: Ja werde ich sein, aber ich habe eine Frage Erstens, hat die Datei nach jeder Zeile einen Zeilenumbruch? –

+0

Ja, aber ich stelle mir vor (wie dies an einen "Autograder" gesendet wird), dass die Newline überall sein kann? Aber sicher, lassen Sie uns einfach mit der Vorstellung gehen, dass ein Newline ist nur nach jeder Zeile .. – codefail

2

Sie setzen Sie können ins.get() in einer do while-Schleife:

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

Sie haben ein paar gute Möglichkeiten. Speichern Sie den Zeilenumbruch nicht in der Datei, verwerfen Sie sie explizit in Ihrer Schleife oder verwenden Sie std::getline() in <string>.

Zum Beispiel mit 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()); 
} 
Verwandte Themen