2017-04-04 46 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'上打印矢量的每个单独元素,好奇我为什么不能将它们打印在原始位置。 –