2010-04-01 10 views
5

Je lis un fichier dans un tableau. Il lit chaque char, le problème se pose en ce qu'il lit également une nouvelle ligne dans le fichier texte.Besoin d'ignorer le caractère newline ( n) du fichier d'entrée

C'est une carte firefighters, voici mon code pour la lecture dans le charbon:

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

comme je l'ai dit, il lit le fichier, affiche à l'écran, mais pas dans l'ordre correct lorsqu'il rencontre le \ n

+0

Tag la question des devoirs si elle est une question de devoirs. – wilhelmtell

Répondre

0

Bien dans votre format de fichier, vous ne pouvez simplement pas enregistrer les nouvelles lignes, ou vous pouvez ajouter une ins.get() à la boucle for.

Vous pouvez également placer c = ins.get() dans une fonction quelque chose comme getNextChar() qui ignorera les nouvelles lignes.

Je pense que vous voulez quelque chose comme ceci:

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

pourriez-vous être un peu plus précis? à peu près un n00b ici. Peut-être que je ne me suis pas bien expliqué - J'en ai besoin pour sauter le retour à la ligne quand il le rencontre et ne pas l'écrire à l'élément du tableau ... – codefail

+0

@igor: Oui je le serai mais j'ai une question D'abord, est-ce que le fichier a un retour à la ligne après chaque ligne? –

+0

Oui, mais j'imagine (comme cela sera envoyé à un "autograder") que le retour à la ligne peut être n'importe où? Mais bien sûr, laisse juste aller avec la notion qu'un retour à la ligne est seulement après chaque ligne .. – codefail

2

Vous pouvez vous mettre ins.get() dans une boucle Do While:

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

Vous avez quelques bonnes options. N'enregistrez pas le saut de ligne dans le fichier, ne les supprimez pas explicitement dans votre boucle ou utilisez std::getline() dans <string>.

Par exemple, en utilisant 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()); 
}