如何将文本文件行读取为向量?

时间:2019-05-03 22:13:45

标签: c++

我需要从输入文件中读取一些行到矢量(整数)中,而c ++对我来说是新的,所以我很难理解具有许多功能的大型代码。 你能告诉我最基本的方法吗?

在我的文件中,我有类似以下内容:

5 6 11 3 4
2 3 1
1 
9

我用另一个程序编写了输入文件,所以如果我使阅读更容易,我可以在其中显示向量的数量(在这种情况下为4)及其大小(5、3、1、1)。

我的意思是我可以任何形式展示信息...只需要知道哪一种更好以及如何使用它即可。

3 个答案:

答案 0 :(得分:1)

这是一个简单的示例,其中使用std::istringstream提取每一行的值。

(请注意,it is not necessary to call eof() before reading。)

std::ifstream file("file.txt");
std::vector<std::vector<int>> vectors;
std::string line;
while (std::getline(file, line))
{
  std::istringstream ss(line);
  std::vector<int> new_vec;
  int v;
  while (ss >> v)                 // populate the new vector
  {
    new_vec.push_back(v);
  }
  vectors.push_back(new_vec);     // append it to the list of vectors
}
file.close();

答案 1 :(得分:1)

这并不是真正的“基本方法”,但是它很简短并且可以正常工作:

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

int main()
{
    std::vector<std::vector<int>> vec;

    std::ifstream file_in("my_file.txt");
    if (!file_in) {/*error*/}

    std::string line;
    while (std::getline(file_in, line))
    {
        std::istringstream ss(line);
        vec.emplace_back(std::istream_iterator<int>(ss), std::istream_iterator<int>());
    }
}

具有相同功能的稍微简化的版本:

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

int main()
{
    std::vector<std::vector<int>> vec;

    std::ifstream file_in("my_file.txt");
    if (!file_in) {/*error*/}

    std::string line;
    while (std::getline(file_in, line)) // Read next line to `line`, stop if no more lines.
    {
        // Construct so called 'string stream' from `line`, see while loop below for usage.
        std::istringstream ss(line);

        vec.push_back({}); // Add one more empty vector (of vectors) to `vec`.

        int x;
        while (ss >> x) // Read next int from `ss` to `x`, stop if no more ints.
            vec.back().push_back(x); // Add it to the last sub-vector of `vec`.
    }
}

我不会将字符串流称为基本功能,但是如果没有字符串流,您想要做的事情会更加混乱。

答案 2 :(得分:0)

这应该可以完成工作:

int n; char c;
vector<int> vectors[4];

//variable to record what vector we are currently looking
int vectorIndex = 0;

//reading an integer while it's possible
while(scanf("%d", &n)){
    //reading char, if couldn't read, breaks out of the loop
    if(!scanf("%c", &c)) break;
    //adding the integer we've just read into the vectorIndex-th vector
    vectors[vectorIndex].push_back(n);
    if(c == '\n') vectorIndex++;
}

首先,我们声明一个带有一些向量的数组(如果您想要一些动态的东西,可以有一个整数向量的向量)。

然后,我们只读取一个int(有一个int),然后读取一个char。如果char是\n,则我们知道向量结束了,然后我们转到下一个(使用vectorIndex表示当前正在向哪个向量中添加元素)。