将由空格分隔的未知数量的整数读入每行一个向量

Posted

技术标签:

【中文标题】将由空格分隔的未知数量的整数读入每行一个向量【英文标题】:Reading in an unknown number of integers separated by spaces into one vector per line 【发布时间】:2013-11-29 04:59:39 【问题描述】:

我的文件的每一行都由未知数量的整数组成,它们之间用空格分隔。我想在每一行中读取这些整数的向量。

以下是此类文件的示例:

11 3 0 1
4 5 0 3
2 3 4 1
23 4 25 15 11
0 2 6 7 10
5 6 2
1
11

我已经能够使用以下方法成功读取少量数据(请注意,outer_layers 是一个包含我要填充的这些向量的向量):

for (int i = 0; i < outer_layers.size(); i++)

    while (in >> temp_num)
    
        outer_layers[i].inner_layer.push_back(temp_num);
        if (in.peek() == '\n')
            break;
    

但是,当我尝试读取大量数据时,有时它会在一个向量下的两行中读取。在其中一个文件中,在 24 行中,它两次读取了两行,因此最后两个向量没有任何数据。

我无法绕过它。任何想法我做错了什么?

编辑:我在麻烦制造者文件的某些行中注意到的一些有趣的事情是:

假设有三行。

23 42 1 5
1 0 5 10
2 3 11

第 1 行读入就像 23 42 1 5 一样好;但是,第 2 行和第 3 行一起读取为1 0 5 10 2 3 11

在 Notepad++ 中,它们看起来还不错,各有各的一行。但是,在记事本中,它们看起来像这样:

23 42 1 51 0 5 10 2 3 11

如果您注意到,5(第 1 行的最后一个整数)和1(第 2 行的第一个整数)没有用空格分隔;但是,102 用空格分隔。

我注意到任何双读行上的行为。如果它们用空格分隔,那么它们都会被读入。不知道为什么会发生这种情况,考虑到 Notepad++ 中仍然应该有一个换行符来显示单独的行,对吗?

【问题讨论】:

【参考方案1】:

我不确定您的 outer_layersinner_layers 是如何设置的,但您可以使用 std::getlinestd::stringstream 来填充您的向量,如下所示:

    std::vector< std::vector<int> > V ;
    std::vector <int> vec;

    std::ifstream fin("input.txt");

    std::string line;
    int i;
    while (std::getline( fin, line) ) //Read a line 
    
       std::stringstream ss(line);

       while(ss >> i) //Extract integers from line
         vec.push_back(i);

       V.push_back(vec); 
       vec.clear();

    

  fin.close();

  for(const auto &x:V)
  
    for(const auto &y:x)
      std::cout<<y<<" ";
    std::cout<<std::endl;
  

【讨论】:

谢谢。它工作得很好。仍然想知道整个空格和行之间没有空格有什么问题(在我的编辑中进行了解释)。 @Noobacode 我不确定你的意思,但看起来像一些 CRLF 问题,通常在你在 linux 上保存文本文件并在 Windows 上使用时发生,反之亦然跨度> 嗯,可能就是这样。文件保存在 Mac OS 上。谢谢!

以上是关于将由空格分隔的未知数量的整数读入每行一个向量的主要内容,如果未能解决你的问题,请参考以下文章

将由空格分隔的整数字符串更改为 int 列表

有没有一种简单的方法可以将由空格字符分隔的一行输入拆分为 C++ 中的整数?

Java - 如何将用空格分隔的整数读入数组

将用空格分隔的整数读入 int[] 数组

在Python中拆分具有未知数量空格的字符串作为分隔符

在 T-SQl 中使用 like 搜索由未知数量的空格分隔的单词