【问题标题】:Reading the specific data from the file using Vector function C++使用 Vector 函数 C++ 从文件中读取特定数据
【发布时间】:2015-11-26 16:20:39
【问题描述】:

我是 C++ 新手,在从文件中导入特定数据(数字)时遇到困难。 我的输入看起来像:

Open    High    Low     Close
1.11476 1.11709 1.10426 1.10533
1.10532 1.11212 1.10321 1.10836
1.10834 1.11177 1.10649 1.11139
1.09946 1.10955 1.09691 1.10556  
1.10757 1.11254 1.09914 1.10361
1.10359 1.12162 1.10301 1.11595
1.09995 1.10851 1.09652 1.10097

我使用以下代码可以很好地阅读第二列,但我只需要阅读特定数据。例如第三行/第三列是 1.10649

我怎样才能读取特定数据?我是否需要使用 string 来获取行/列,然后将其转换为 int 以便在 vector 中读取它?我愿意接受任何建议,如果有任何建议可以帮助我解决这个问题,我将不胜感激。

// Data import 2nd Column

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <vector>

using namespace std;

int main()
{
const int columns = 4;

    vector< vector <double> > data;

  ifstream market_data("market_data.txt");

    if (market_data.is_open()) {
        double num;

        vector <double> line;

        while (market_data >> num) {
            line.push_back(num);

            if (line.size() == columns) {
                data.push_back(line);
                line.clear();
            }
        }
    }

    vector <double> column;
    double col = 2;

    for (double i = 0; i < data.size(); ++i) {
        column.push_back(data[i][col - 1]);
        cout << column[i] << endl;
    }

    system ("pause");
    return 0;
}

【问题讨论】:

    标签: c++ string file-io vector import


    【解决方案1】:

    您需要使用整数值进行索引(准确地说是size_t),更改

     for (double i = 0; i < data.size(); ++i) {
    

     for( size_t i = 0; i < data.size(); ++i) {
       // ^^^^^^
    

    否则,您的代码示例看起来一切正常。

    【讨论】:

    • 为什么不改成“确切地说是size_t”(你让编译器发出有符号/无符号警告)?
    • @DieterLücking 好主意,已修复。
    • @πάνταῥεῖ 感谢您的回复,但是通过更改为 size_t 并不能解决问题,输出仍然相同.. 我只需要在所有数据中获得 1.10649 的输出跨度>
    【解决方案2】:

    如果你的数字总是包含 7 个字符(我假设它不是二进制文件),那么你可以让它变得简单。

    使用 ifstream 的 seekg() 方法。

    每个数字填充 10 个字符(7 个数字,3 个空格)。因此,如果您有表 ROWS x COLUMNS,那么要获取特定数字,您可以这样做:

    const int ROW_LEN = 4
    const int DATA_LEN = 10
    ...
    int row,column;
    double num;
    
    std::cin >> row; //assume first row is 0
    std::cin >> column //assume first column is 0
    
    marked_data.seekg((column*ROW_LEN + row)*DATA_LEN);
    
    marked_data >> num // here is your number
    

    【讨论】:

    • 不,数字是文本格式,实际上大小可能会有所不同。这只是基于输入格式假设的糟糕建议。读取数字的代码已经做好了。
    • “如果你的号码总是包含 7 个字符”。我知道它不是通用的,但对于这个特定问题它更快。如果你有 1000x1000 的这些数字,然后从随机位置读取它们,那会非常非常慢。
    • 啊。好吧,我的大脑欺骗了我——我忘记了换行符,所以这段代码无论如何都被破坏了。如果它应该起作用,则必须在计算中考虑 1 个(或 2 个,对于 \r\n)字符。很抱歉给了一个错误的建议。
    • 后一个缺陷甚至是特定于操作系统/文件格式的。但是很高兴看到新成员在这里积极参与。
    【解决方案3】:

    感谢您的回复。我已经解决了这个问题。所以代替:

    vector <double> column;
        double col = 2;
    
    for (double i = 0; i < data.size(); ++i) {
        column.push_back(data[i][col - 1]);
        cout << column[i] << endl;
    }
    


    写够了:

    cout

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      • 2020-07-13
      相关资源
      最近更新 更多