2015-11-26 187 views
0

我是C++中的新成员,并且难以从文件导入特定数据(数字)。 我的输入是这样的:使用Vector函数从文件中读取特定数据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

如何读取特定数据?我是否需要使用字符串获取行/列,然后将其转换为int以便在向量中读取它?如果有任何建议可以帮助我解决这个问题,我将不胜感激。

// 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; 
} 

回答

0

感谢您的答复。我已经解决了这个问题。因此,而不是:

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 < <数据[2] [2] < < ENDL;

3

你需要使用一个整数值进行索引(size_t要准确),改变

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

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

否则,一切似乎从你的代码示例罚款。

+1

为什么不更改为“size_t是精确”(您是否让编译器发出签名/未签名警告)? –

+0

@DieterLücking好主意,修正。 –

+0

@πάνταῥεῖ谢谢你的回复,但通过改变size_t并没有解决问题,输出仍然是相同的..我需要的是获得所有数据中的1.10649输出 – Tinto

0

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

使用ifstream的seekg()方法。

每个数字填充10个字符(7个数字,3个空格)。所以,如果你有表行x列,然后得到具体的数字,你可以这样做:

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 
+0

不,数字是文本格式和实际上可能会有所不同。这只是基于输入格式假设的糟糕建议。阅读数字的代码已经完成。 –

+0

“如果你的号码总是包含7个字符”。我知道这不是普遍性的,但对于这个特定问题来说速度更快。如果你有1000x1000的这些数字,然后从随机位置读取它,那真的很慢。 – xinaiz

+0

如果这确实存在疑问,可以争论。但是... –