2017-02-27 14 views
0

さまざまなデータ型(int、文字列)を持つ変数に文字列を解析する必要があります。C++異なるデータ型変数に文字列をパースする

問題の文字列は、ファイル内の行から取得されました。

inFile >> var1 >> var2 >>などと似た関数があるのでしょうか。私は文字列のために使用することができます。以下はファイルからの完全な行です。

2016年12月6日の "政府と大企業との近親相姦の関係は暗闇の中で繁栄する。〜ジャック・アンダーソン[4]" 0 3 39、青、白PATRICK BARDWELLの[email protected]

Iすでに「2016/12/6」、「s」、および引用符の間のすべてをinFile >>;を使用する変数に割り当てました。また、二重引用符が最後に出現した後にすべてを取り出し、それを文字列restOfLineに格納しました。今、restOfLineを各値(0,3,39、青、白、Patrick、Bardwell、[email protected]はすべて別々の変数にする必要があります)の変数に解析したいと思います。 inFile >>のようなメソッドがありますか?私もrestOfline.find()とrestOfLine.substr()でそれらを分離しようとしましたが、それを理解することはできませんでした。同様に、私が現在のコードよりも効率的に行全体から各値を分けることができるなら、私はそれを好むでしょう。現在のコードは以下です。どんな助けも大歓迎です。

int main() 
{ 

    // Declare variables 
    string userFile; 
    string line; 
    string date; 
    char printMethod; 
    string message; 
    int numMedium; 
    int numLarge; 
    int numXL; 
    string shirtColor; 
    string inkColor; 
    string firstName; 
    string lastName; 
    string customerEmail; 
    string firstLine; 
    string restOfLine; 


    // Prompt user to 'upload' file 

    cout << "Please input the name of your file:\n"; 
    cin >> userFile; 
    fstream inFile; 
    inFile.open(userFile.c_str()); 

    // Check if file open successful -- if so, process 

    if (inFile.is_open()) 
    { 
     getline(inFile, firstLine); // get column headings out of the way 
     cout << firstLine << endl << endl; 

     while(inFile.good()) 
// while we are not at the end of the file, process 
     { 

      getline(inFile, line); 

      inFile >> date >> printMethod; // assigns first two values of line to date and printMethod, respectively 

      int pos1 = line.find("\""); 
// find first occurrence of a double quotation mark and assign position value to pos1 
      int pos2 = line.rfind("\""); 
// find last occurrence of a double quotation mark and assign position value to pos2 

      string message = line.substr(pos1, (pos2 - pos1)); 
// sets message to string between quotation marks 

      string restOfLine = line.substr(pos2 + 2); 
// restOfLine = everything after the message -- used to parse 

     } 

     inFile.close(); 
    } 

    // If file open failure, output error message, exit with return 0; 

    else 
    { 

     cout << "Error opening file"; 

    } 

    return 0; 

} 
+0

[stringstream](http://stackoverflow.com/questions/20594520/what-exactly-does-stringstream-do)sは既に知っていますか? –

答えて

0
#include <iostream> 
#include <string> 
#include <vector> 
#include <algorithm> 
using namespace std; 
unsigned int split(const std::string &txt, std::vector<std::string> &strs, char ch); 
    int main(int argc, const char * argv[]) { 

    string text = "2016/12/6 s \"The incestuous relationship between government and big business thrives in the dark. ~Jack Anderson [4]\" 0 3 39 blue white PATRICK BARDWELL [email protected] "; 
    std::vector<std::string> v; 

    split(text, v, ' '); 
    return 0; 
} 

unsigned int split(const std::string &txt, std::vector<std::string> &strs, char ch) 
{ 
    unsigned int pos = static_cast<unsigned int>(txt.find(ch)); 
    unsigned int initialPos = 0; 
    strs.clear(); 

    // Decompose statement 
    while(pos >! txt.size()) { 
     strs.push_back(txt.substr(initialPos, pos - initialPos + 1)); 
     initialPos = pos + 1; 

     pos = static_cast<unsigned int>(txt.find(ch, initialPos)); 
     if(pos > txt.size()) break; 
    } 

    // Add the last one 
// strs.push_back(txt.substr(initialPos, std::min(pos, static_cast<unsigned int>(txt.size())) - initialPos + 1)); 

    return static_cast<unsigned int>(strs.size()); 
} 

ので、プログラム上の部分に故障あなたの文字列は、データ型変換のために言及した機能の下に使用されます。 文字列をintに変換するには、std :: stoi(str)を使用します。これはC++ 11で使用できます。 ロングストール(ストリング)、フロートストーン(ストリング)、ダブルストップ(ストリング)など、すべてのタイプのバージョンがあります。 http://en.cppreference.com/w/cpp/string/basic_string/stolを参照してください。

1

inFile >> var1 >> var2 >>などと似た機能があるのでしょうか。私は文字列のために使用することができますか?

はい、実際には同じではありません。文字列ストリームはファイルストリームと同じように動作します。

std::stringstream ss(restOfLine); 
ss >> numMedium >> numLarge >> numXL >> shirtColor >> inkColor >> firstName >> lastName >> customerEmail >> firstLine; 
関連する問題