2016-11-12 70 views
0

我正試圖解析一個文本文件。我正在使用空格分隔單詞。這裏是文本文件的樣子。如何通過文本文件解析C++?

123456789 15.5 3 40.0 

這種格式約有15行。現在正在使用

int sin = stoi(line.substr(0, line.find(' '))); 

我可以分開前兩個單詞但不是其他的?!!

const char * IN_FILE = "EmployeePayInput.txt"; 

    // A second way to specify a file name: 
    #define OUT_FILE "EmployeePayOutput.txt" 

int main() 
    { 


ifstream ins; 
     ins.open(IN_FILE); 
     //Check that file opened without any issues 
     if (ins.fail()) 
    { 
     cerr << "ERROR--> Unable to open input file : " << IN_FILE << endl; 
     cerr << '\n' << endl; 
     _getch(); // causes execution to pause until a char is entered 
     return -1; //error return code 
    } 

    //Define ofstream object and open file 
    ofstream outs; 
    outs.open(OUT_FILE); 

    //Check that file opened without any issues 
    if (outs.fail()) 
    { 
     cerr << "ERROR--> Unable to open output file : " << OUT_FILE << endl; 
     cerr << '\n' << endl; 
     _getch(); // causes execution to pause until a char is entered 
     return -2; //error return code 
    } 

    // Process data until end of file is reached 
    while (!ins.eof()) { 
     string line; 


     while (getline(ins, line)) { 
      Employee e; 


      int sin = stoi(line.substr(0, line.find(' ')));//prints and stores the first item in sin 
      e.setSin(sin); 
      cout << sin << endl; 
      float hourly = stof(line.substr(line.find(' '))); 
      cout << hourly << endl;//prints and stores the second item in hourly 
      e.setPayRate(hourly); 
      int exemption = stof(line.substr(line.find(' '))); //doesn't do anything, I need to read the next item in the same line 
       cout << exemption << endl; 

     } 
    } 


    // Close files 
    ins.close(); 
    outs.close(); 

    cout << '\n' << endl; 

    // Remove following line of code (and this comment) from your solution 
    cout << "Type any key to continue ... \n\n"; 

    _getch(); // causes execution to pause until char is entered 
    return 0; 
} 

回答

0

我會重寫你的輸入邏輯是這樣的:

// Process data until end of file is reached 
string line; 
while (getline(ins, line)) { 
    std::istringstream iss(line); 
    if (iss >> sin >> hourly >> exemption) { 
     Employee e; 
     e.setSin(sin); 
     e.setPayRate(hourly); 
     cout << exemption << endl; 
    } 
} 

至於你的具體問題,line.substr(line.find(' ')取行的其餘部分從第一' '的位置。 line不會被這個操作改變,所以如果你第二次調用它,你會得到相同的結果。