2017-04-04 68 views
0

我正在閱讀文本文件並加載到std::vector<std::string> course,當我嘗試打印它時,它基於course.size()course[i].size它只打印最後一行。cout for 2D字符串矢量僅打印最後一行

下面是代碼:

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

通過添加也許試過'\r'去除:

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

但是,這只是打印出來的每個[i][j]每行彼此相鄰。

的數據是這樣的:

xxxxxxxxxxxx 
xxx yyyxxx 
xxxXXYYxxyyy 
+0

你檢查(打印,調試器)'course.size()'的值? 「 –

+0

」但是,每行只顯示了每一行[i] [j]。「 - 這將是預期的輸出,你的代碼在任何階段都不會輸出換行 –

+0

@ M.M這是一個錯字,它不是'\ n'。當我擺脫'\ r',然後通過'for'循環到'cout'時,它輸出第一行,然後是空格,然後是下一行,然後是空格等等...在同一行上;它從不換行。我試圖讓每個'[i] [j]'打印它被讀入時的位置。 –

回答

1

std::getline分隔字符(在你的情況下,新行)添加到輸出字符串。因此,您的std::vector<std::string> coursestd::string中沒有一個包含換行符。因此,在編寫每個字符串之後,您需要自己輸出一個換行符。

然後請注意,內部for循環是完全不必要的。還有的operator<<std::string過載/專業化,從而可以簡化爲:

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矢量怎麼辦?爲什麼兩個'for'循環不打印'[0] [1] [0] [2] ... [0] [k]'? –

+0

除此之外,使用這些'for'循環,我可以在'newline'上打印矢量的每個單獨元素,好奇我爲什麼不能將它們打印在原始位置。 –