2016-04-07 48 views
0

タイトルから、ファイルから読み込み、文字を2次元配列にスペースで保存しようとしていますが、ファイルのdo whileループと最後の文字にはまっています。どのようにこれを修正するための任意の提案?私はeofbitを使うことを考えましたが、私はそれを理解できませんでした。それはその仕事をしなかった。それはちょうどファイルの最後の文字にぶら下がっているようです。あなたはそれをチェックするため、第2の条件が検証されることはありませんので、この条件が常に真であるファイルの末尾に、あなたのアドバイスC++は2次元配列にファイルを読み込みます

char ch[100][100]; 
int row_count =0; 
int col_count = 0; 
int col[100]; 
char temp; 
bool exit = false; 
ifstream infile("data.txt"); 
if(infile.is_open()) 
{ 
    while(!infile.eof()) 
    { 
     do 
     { 
      infile.get(temp); 
      char[row_count][col_count] = temp; 
      col_count++; 

     }while(temp != '\n' || !infile.eof()); 
     col[row_count] = col_count; 
     row_count++; 
     col_count= 0; 
    } 
} 

for(int i = 0; i <= 2; i++) 
{ 
    for(int j=0; i <= col[i]; j++) 
    { 
     cout << ch[i][j]; 
    } 
    cout << endl; 
} 

return 0; 

}

+0

(infile.eof()!)中に使用しないでくださいここを参照してください:http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-間違って試してみてください(infile.get(temp))。同様の条件の2つのネストループもなぜですか?ちょうどif文を入れてください –

+0

ストリームの['getline'](http://en.cppreference.com/w/cpp/io/basic_istream/getline)メソッド – WhozCraig

+0

でこれはかなり単純になります。あなたは一番です。 –

答えて

0

ループが原因temp != '\n'であるため、事前にあなたに感謝またはで。コードを保持したい場合は、最初に!infile.eof()を持ってください。

しかし、あなたが最良の方法とファイルを読むための簡単な方法を望むなら。 getlineを使用してください。

std::string line; 
while(std::getline (infile,line)) 
{ 
    //do something for every char in the string... 
} 
0

私はこれをコンパイルしていなかったが、これは動作するはずです: のコメントを読んで、それから学びます。

#include <iostream> // for cout 
#include <fstream> // for infile  

int main() 
{ 
    const int RowSize = 100, ColSize = 100; 
    char ch[RowSize][ColSize]; 
    int row_count = 0; 
    int col_count = 0; 
    int col[ColSize]; 
    char temp; 
    bool exit = false; 

    std::ifstream infile; 

    infile.open("data.txt"); // open the file 

    if (!infile.is_open()) // check if opened succseffuly 
    { 
     std::cout << "File didn't load successfully!" << std::endl; // prompt the user 
     getchar(); // wait for any input 
     return 0; // terminate 
    } 

    while (infile.get(temp)) // while reading succesffuly 
    { 
     // if you are here, means you have valid data 

     if (temp == '\n') // check if end of the line 
     { 
      col_count = 0; // reset cols 
      row_count++; // increment rows 
      ch[RowSize][ColSize] = NULL; // lock char array 
      continue; // continue the loop iteration 
     } 
     else 
     { 
      ch[row_count][col_count] = temp; // store temp in your array 
     } 
     col_count++; // increment cols on every read 
    } 

    for (int i = 0; i <= 2; i++) // this will display junk if your line is less than 100 characters (check NULL if you don't want that) 
    { 
     for (int j = 0; i <= col[i]; j++) 
     { 
      std::cout << ch[i][j]; 
     } 
     std::cout << std::endl; 
    } 

    return 0; 
} 
+0

私はあなたの応答と時間をかけていただきありがとうございます。それはコンパイルされませんでしたが、私はそれを私のために働くようにデバッグすることができました。さらに重要なことは、それが私の間違いを理解するのを助け、私が使用していなかった適切な技術を思い出させました。ありがとうございました。 @FirstStep –

+0

@DevilGracelandは助けてくれてうれしかった:)なぜそれがコンパイルされなかったのかをお聞かせください。また、あなたの質問に答えた場合は、それを回答としてマークしてください –

0

iostream::eofは、ストリームの最後を読み取った後にのみtrueを返します。それは、次の読み込みがストリームの終わりになることを示していません。 Ref this。したがって、変更されたコードは次のコードスニペットのようになります。

char ch[100][100]; 
int row_count =0; 
int col_count = 0; 
int col[100]; 
char temp; 
bool exit = false; 
ifstream infile("data.txt"); 
if(infile.is_open()) 
{ 
    while(!(infile>>temp).eof()) 
    { 

     ch[row_count][col_count] = temp; 
     col_count++; 

     if(temp == '\n'){ 
      col[row_count] = col_count; 
      row_count++; 
      col_count= 0; 
     } 
    } 
} 

for(int i = 0; i <= 2; i++) 
{ 
    for(int j=0; i <= col[i]; j++) 
    { 
     cout << ch[i][j]; 
    } 
    cout << endl; 
} 

return 0; 

} 
関連する問題