【问题标题】:cout not printing string of vector after getlinecout 在 getline 之后不打印向量字符串
【发布时间】:2021-05-04 16:30:47
【问题描述】:

我有一个包含以下内容的 .csv 文件:

1.0,2.0
2.0,3.0

现在我想读取这个文件并将其打印到终端。 我希望输出如下所示:

1.0|2.0|
2.0|3.0|

但我得到的只是:

|
|

当我运行调试器时,向量包含正确的数据,但它不会打印它。

cout 时的向量数组(调试器):

array = {std::vector<std::vector>}
   [0] = {std::vector<std::basic_string, std::allocator>}
      [0] = {std::basic_string<char, std::char_traits, std::allocator>} "1.0"
      [1] = {std::basic_string<char, std::char_traits, std::allocator>} "2.0\r"
   [1] = {std::vector<std::basic_string, std::allocator>}
      [0] = {std::basic_string<char, std::char_traits, std::allocator>} "2.0"
      [1] = {std::basic_string<char, std::char_traits, std::allocator>} "3.0\r"

我的代码:

#include <string>
#include <sstream>
#include <iostream>
#include <vector>
#include <fstream>

int main()
{
    using namespace std;

    ifstream in("C:\\Users\\freit\\CLionProjects\\Aufgabe2\\data.csv", ios_base::in);

    string line, field;

    vector< vector<string> > array;  // the 2D array
    vector<string> v;                // array of values for one line only

    while ( getline(in,line) )    // get next line in file
    {
        v.clear();
        stringstream ss(line);

        while (getline(ss,field,','))  // break line into comma delimited fields
        {
            v.push_back(field);  // add each field to the 1D array
        }

        array.push_back(v);  // add the 1D array to the 2D array
    }

    // print out what was read in

    for (size_t i=0; i<array.size(); ++i)
    {
        for (size_t j=0; j<array[i].size(); ++j)
        {
            cout.flush();
            cout << array[i][j] << "|"; // (separate fields by |)
        }
        cout << "\n";
    }

    return 0;
}

【问题讨论】:

  • 在此处打印预期输出:godbolt.org/z/rT5rPY5Ev(除了额外的尾随 |
  • 问题是:即使array[i][j] 的内容没有打印出来,你也应该看到|| 而不仅仅是| 每行。你确定你正在编译你认为你正在编译的代码吗?
  • 我确定。这就是为什么我很困惑...使用 clion
  • \r 是回车符escape sequence。可能是您在 Windows 中编写文件但在 Linux 中读取文件,反之亦然,请参见此处:superuser.com/questions/374028/…
  • 我会写这个评论作为答案

标签: c++ ifstream c++20 cout getline


【解决方案1】:

问题在于我想阅读的data.cls。 调试器在每一行的末尾显示一个\r (escape sequence)。 这可能是在使用 Excel 打开 data.cls 并勾选自动保存后出现的。 使用标准 Windows 文本编辑器编写新的data.cls 后问题得到解决。感谢 cmets 得到了解决方案!

【讨论】:

  • 当答案解决了你的问题时,你应该接受它:)
  • 仅在 2 天内可用
  • 哦,真的吗?不知道那个限制。无论如何,很高兴能提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 2020-11-08
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
相关资源
最近更新 更多