【问题标题】:C++ Line into VectorC++ 线到向量
【发布时间】:2010-11-29 22:56:19
【问题描述】:

哇,我今天到处都是问题,如果它们似乎重叠,我深表歉意,但是对于每个问题都会有另一个问题......因为一件事不起作用......但我应该使用一些东西其他……等等。

无论如何,我有一个文本文件:

6
3.0 2.5 -1.5 0.0 1.7 4.0
6 10

6 是第二行中“浮点数”的数量(3.0、2.5 等...) 3.0,2.5,-1.5 都是一系列的浮点数。 6 和 10 只是 2 个整数。

我有一个向量

std::vector<double> numbers;

我需要做的就是将第二行放入数字中。 所以现在我有

ifstream myfile (filename.c_str());

我可以简单地做一个 myfile>> 来获得第一个值 (6) 但是我将如何将第二行放入我的向量中?请记住,通过阅读第一行(在本例中为 6),我只知道第 2 行有多大。

最后两个数字也不应该在这个向量中,而是两个单独的值。 我可以做 myfile >> a >> b.

再次抱歉,问了这么多问题。但我确实一直在到处寻找并且可能问了错误的问题。

【问题讨论】:

  • 那是 6 个花车,不是 5 个?!
  • 第一行是6,是不是打错字了?
  • 认为是,但在整个问题中都是一致的,所以我想我最好问一下。
  • 这是一种类型。我的意思是后面的6个

标签: c++ file vector fileinputstream


【解决方案1】:
myfile >> numElements;
numbers.resize(numElements);
for (int i = 0; i < numElements; i++) {
    myfile >> numbers[i];
}
myfile >> a >> b;

【讨论】:

  • 为了完整起见,可以添加 int a,b,numElements;声明和 std::vector 数字;声明也一样?
  • @Dat 我想你刚刚做到了。 :)
【解决方案2】:

类似:

int count, a, b;
double tmp;
std::vector<double> numbers;
ifstream myfile (filename.c_str());
myfile >> count;
for(int i = 0; i < count; ++i) {
    myfile >> tmp; numbers.push_back(tmp);
}
myfile >> a >> b;

【讨论】:

  • 我最终使用了这个,它看起来更干净。感谢所有回答的人。
  • chrisaycock 的解决方案更好,因为它不会不必要地扩展向量。您已经知道需要多少空间。
【解决方案3】:

我将从您已经从文件中读取该行的地方开始,因为您似乎对此没有意见。这是最基本的方法。我下面的代码使用非常简单的代码说明了这种方法,可以用来理解它是如何工作的。

  1. 将要解析的行转换为string,这是我下面代码中的line
  2. string 中搜索标记,其中每个标记都由非数字、小数或负号的任何内容分隔
  3. 对于每个标记,使用stringstream 将字符串转换为double
  4. 将转换后的 double 添加到您的向量中

在循环结束时,我还将向量转储到屏幕上以供检查。

#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <iterator>
using namespace std;

int main()
{
    string line = "3.0 2.5 -1.5 0.0 1.7 4.0";
    vector<double> doubles;

    string::size_type n_begin = 0;
    string::size_type n_end = line.find_first_not_of("-.0123456789", n_begin);
    while( n_begin != string::npos )
    {
        string cur_token = line.substr(n_begin, n_end-n_begin);
        stringstream ss;
        ss << cur_token;
        double cur_val = 0.0;
        ss >> cur_val;
        doubles.push_back(cur_val);
        // set up the next loop
        if( n_end == string::npos )
            n_begin = n_end = string::npos;
        else
        {
            n_begin = n_end + 1;
            n_end = line.find_first_not_of("-.0123456789", n_begin);
        }
    }

    copy(doubles.begin(), doubles.end(), ostream_iterator<double>(cout, "\n"));
}

【讨论】:

    【解决方案4】:

    你的库中有copy_n()吗?

    template<class In, class Size, class Out>
    Out copy_n(In first, Size n, Out result)
    {
        while( n-- ) *result++ = *first++;
        return result;
    }
    

    将其放在您可以轻松地将其#include 到其他翻译单元中的位置。这很有用。像这样使用它来复制您的 n 浮点值:

    copy_n(std::istream_iterator<double>(std::cin),
           n,
           std::back_inserter(v));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 2020-06-28
      • 1970-01-01
      相关资源
      最近更新 更多