2017-04-04 4 views
0

私はテキストファイルを読み込んで、にロードしています。course.size()course[i].sizeに基づいて印刷しようとすると、最後の行のみが出力されます。ここで2次元文字列ベクトルのみの最後の行を印刷するためのcout

は、コードは次のとおりです。

追加することにより、 '\r'除去多分しようとしました
int main(int argc, char** argv) { 
    ifstream fin(argv[1]); 
    vector<string> course; 
    string line; 

    while (getline(fin, line)) { 
     course.push_back(line); 
    } 

    for (int i = 0; i < course.size(); i++) { 
     for (int j = 0; j < course[i].size(); j++) { 
      cout << course[i][j]; 
     } 
    } 

    return 0; 
} 

if (!line.empty() && line[line.size() - 1] == '\r') { 
    line.erase(line.size() - 1); 
} 

しかし、単にお互いに次の行ごとに各[i][j]をプリントアウトしていることを。

xxxxxxxxxxxx 
xxx yyyxxx 
xxxXXYYxxyyy 
+0

あなたが調べていました(印刷、debugger) 'course.size()'の値は? –

+0

"しかし、それはちょうどお互いの隣の行ごとに[i] [j]を印刷しました。 - それは期待される出力であり、あなたのコードはどの段でも改行を出力しません。 –

+0

@ M.Mこれはタイプミスで、 '\ r'ではなく' \ n'でした。 '\ r'を取り除いて' for'ループを通って 'cout'に行くと、最初の行を出力し、次に空白を、次に次の行を、次に空白などを出力します。 ;それは決して改行しない。 –

答えて

1

std::getlineは、出力文字列に区切り文字(あなたのケースでは改行)を追加しません

データは次のようになります。したがって、std::vector<std::string> coursestd::stringには改行が含まれていません。したがって、それぞれの文字列を記述した後、改行を自分で出力する必要があります。

内側のforループは完全に不要であることに注意してください。 std::stringためoperator<<の過負荷/専門があります、したがって、あなたは、簡素化することができた:

for (std::size_t i = 0; i < course.size(); ++i) { 
    std::cout << course[i] << std::endl; // or '\n' if you don't need flushing 
} 

あなたは内側のループを主張する場合:

for (std::size_t i = 0; i < course.size(); i++) { 
    for (std::size_t j = 0; j < course[i].size(); j++) { 
     std::cout << course[i][j]; 
    } 
    std::cout << '\n'; 
} 

Live in action.

+0

知っておいて、間違いなく動作しますが、 'int'または' char'の2Dベクトルを出力したい場合はどうなりますか?なぜ2つの 'for 'ループは' [0] [1] [0] [2] ... [0] [k] 'を印刷しませんでしたか? –

+0

それ以外にも、 'for'ループを使って、ベクトルの個々の要素を' newline'に印字することができます。どうして私はそれらを元の位置に印刷できないのでしょうか? –

関連する問題