2014-03-30 43 views
0

我對C++很新,很抱歉,如果這是一個愚蠢的問題!試圖從文件中的行中獲取數據

對於一個項目,我們給出了一個包含數千行值的文件,每行有9個不同的數字。

我想創建一個for/while循環,對於每個循環,將一行的第8個和第9個整數存儲爲一個變量,以便我可以對它們進行一些計算。然後循環會移動到下一行,將該行的第8和第9個數字存儲爲相同的變量,以便我可以對它進行相同的計算,並在行數不足時結束。

我的問題與閱讀文件有關,我只是感到困惑,我會告訴它只從每行中取第8和第9個值。

感謝您的幫助,非常感謝!

回答

0

爲可讀性而非速度而設計。它也不檢查輸入文件是否是正確的格式。

template<class T> ConvertFromString(const std::string& s) 
{ 
    std::istringstream ss(s); 
    T x; 
    ss >> x; 
    return x; 
} 


std::vector<int> values8; 
std::vector<int> values9; 

std::ifstream file("myfile.txt"); 
std::string line; 
while (std::getline(file, line)) 
{ 
    std::istringstream ss(line); 
    for (int i = 0; i < 9; i++) 
    { 
     std::string token; 
     ss >> token; 
     switch (i) 
     { 
      case 8: 
      { 
       values8.push_back(ConvertFromString<int>(token)); 
      } 
      break; 

      case 9: 
      { 
       values9.push_back(ConvertFromString<int>(token)); 
      } 
      break; 
     } 
    } 

} 
0

首先,split the string,然後使用atoi將它們轉換爲數字。然後,您將從數組或向量中獲取數字的第8和第9個值。

//Split string 
std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) { 
    std::stringstream ss(s); 
    std::string item; 
    while (std::getline(ss, item, delim)) { 
     elems.push_back(item); 
    } 
    return elems; 
} 


std::vector<std::string> split(const std::string &s, char delim) { 
    std::vector<std::string> elems; 
    split(s, delim, elems); 
    return elems; 
} 

//new code goes here 
std::string line; 

std::vector<std::string> lineSplit = split(line, ' '); 
std::vector<int> numbers; 

for (int i = 0; i < lineSplit.size(); i++) 
    numbers.push_back(atoi(lineSplit[i]);//or stoi 

int numb1 = numbers[7];//8th 
int numb2 = numbers[8];//9th 
+0

由於這是C++,你應該推薦的C++結構等['的std :: istringstream'](http://en.cppreference.com/w/cpp/io/basic_istringstream)和['的std :: Stoi旅館'](http://en.cppreference.com/w/cpp/string/basic_string/stol),儘管在這種情況下不需要使用後者。 – 0x499602D2

+0

@ 0x499602D2我無法看到'istringstream'如何適用於此? –

+0

他需要遍歷每行,然後從該行提取整數。他會通過使用'std :: getline()'將行放入一個字符串中,然後使用'std :: istringstream'使字符串充當一個流,以便他可以讀入一個整數。 – 0x499602D2

相關問題