2010-04-01 18 views
5

से न्यूलाइन चार (\ n) को छोड़ने की आवश्यकता है, मैं एक फ़ाइल में एक सरणी में पढ़ रहा हूं। यह प्रत्येक चार को पढ़ रहा है, समस्या उत्पन्न होती है जिसमें यह पाठ फ़ाइल में एक नई पंक्ति भी पढ़ता है।इनपुट फ़ाइल

यह एक सुडोकू बोर्ड, यहाँ है चार में पढ़ने के लिए मेरे कोड है: सही क्रम में

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

जैसा मैंने कहा, यह, फ़ाइल, स्क्रीन पर प्रदर्शित करता है पढ़ता है बस नहीं है जब यह सामना करना पड़ता है \ n

+0

टैग होमवर्क के रूप में सवाल अगर यह एक होमवर्क सवाल है। – wilhelmtell

उत्तर

0

ठीक है आपके फ़ाइल प्रारूप में आप बस नई लाइनों को सहेज नहीं सकते हैं, या आप लूप के लिए ins.get() जोड़ सकते हैं।

आप अपने सी = ins.get() को किसी फ़ंक्शन में लपेट सकते हैं जैसे getNextChar() जो किसी भी न्यूलाइन पर छोड़ देगा।

मुझे लगता है कि आप कुछ इस तरह हैं:

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

क्या आप थोड़ा और विशिष्ट हो सकते हैं? यहां बहुत अधिक n00b है। हो सकता है कि मैंने खुद को अच्छी तरह से समझाया नहीं - मुझे इसे जब भी सामना करना पड़ता है और इसे सरणी के तत्व पर नहीं लिखने की आवश्यकता होती है ... – codefail

+0

@igor: हाँ मैं होगा लेकिन मेरे पास एक प्रश्न है सबसे पहले, क्या प्रत्येक पंक्ति के बाद फ़ाइल में एक नई लाइन है? –

+0

हां, लेकिन मुझे कल्पना है (क्योंकि यह एक "autograder" को भेजा जाएगा) कि नई लाइन कहीं भी हो सकती है? लेकिन निश्चित रूप से, बस इस धारणा के साथ जाएं कि प्रत्येक पंक्ति के बाद केवल एक नई लाइन है .. – codefail

2

आप ins.get() एक करते हैं जबकि पाश रख सकते हैं:

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

आप कुछ अच्छे विकल्प हैं। या तो फ़ाइल में नई लाइन को सहेजें, स्पष्ट रूप से उन्हें अपने लूप में छोड़ दें, या std::getline()<string> में उपयोग करें।

उदाहरण के लिए, 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()); 
} 
संबंधित मुद्दे