2017-05-19 26 views
0

我正在編寫一個程序,它假設能夠打開一個文件,讀取每一行並分隔一個姓,名:3個測試分數。正在閱讀的文件的格式是馬克泰坦:80 80 85.我想輸出TITAN,馬克:80 80 85.我們正在使用字符串,到目前爲止使用我的教師代碼,我已經得到文件完全分離。它會顯示從1-100開始的測試分數(100首先出現,因爲它以1開頭,但我可以在此之後修復),然後按字母順序排列名稱。我需要幫助創建該行的substr,創建一個完整名稱的字符串並將其分解爲第一個和最後一個,然後正確排序它們。我一直在搞亂.find,但我不知道如何將這個向量分成更小的向量。請幫助和謝謝。C++字符串幫助,隨地吐痰字符串

#include <iostream> 
    #include <fstream> 
    #include <vector> 
    #include <sstream> 

    using namespace std; 
    void openFile(ifstream &in); 
    void processFile(ifstream &in, vector<string> &list); 
    void display(const vector<string> &list); 
    void sort(vector<string> &list); 

    int main(int argc, char *argv[]) 
    { 
     ifstream in; 
     string line; 
     vector<string> words; 
     openFile(in); 
     processFile(in, words); 
     display(words); 
     return 0; 
    } 


    void openFile(ifstream &in) 
    { 
     string fileName; 
     bool again; 
     do 
     { 
      again = false; 
      cout<<"What is the name of the file to you wish to sort? (.txt will be added if no extension is included): "; 
      cin>>fileName; 
      if(fileName.find('.') >= fileName.size()) 
       fileName += ".txt"; 
      in.open(fileName.c_str()); 
      if(in.fail()) 
      { 
       in.close(); 
       in.clear(); 
       again = true; 
       cout<<"That file does not exist! Please re-enter"<<endl; 
      } 
     }while(again); 
    } 

    void processFile(ifstream &in, vector<string> &list) 
    { 
     string line, word; 
     int s1,s2,s3; 
     stringstream ss; 
     while(getline(in, line, ':')) 
     { 
      ss<<line.substr(line.find(' ') + 1); 
      while(ss>>word) 
       list.push_back(word); 
      ss.clear(); 
     } 
     sort(list); 
    } 

    void sort(vector<string> &list) 
    { 
     for(unsigned int i = 0; i < list.size(); ++i) 
      for(unsigned int j = 0; j < list.size(); ++j) 
       if(list[i] < list[j]) 
       { 
        string temp = list[i]; 
        list[i] = list[j]; 
        list[j] = temp; 
       } 
    } 

    void display(const vector<string> &list) 
    { 
     cout<<"The file read had "<<list.size()<<" words in it" 
      <<endl<<"In sorted order, they are:"<<endl; 
     for(unsigned int i = 0; i < list.size();++i) 
      cout<<list[i]<<endl;} 
+0

可能的複製分割字符串中的[C++?](http://stackoverflow.com/questions/236129/split-a-string-in-c) –

回答

0

您可以將該行標記兩次。首先,在冒號上分割,然後在空間上分割第一個標記。另外,你的老師會向你扔出空虛和格格不入的線條。例如缺少冒號或缺少名字(或缺少名字/姓氏)。通過計算分割字符串或子字符串時返回的令牌來處理這些錯誤。

void Tokenize(const std::string& theSourceString, std::vector<std::string>& theTokens, const std::string& theDelimiter) 
{ 
    // If no delimiter is passed, tokenize on all white space. 
    if (theDelimiter.empty()) 
    { 
     std::string aBuffer; // Have a buffer string 
     std::stringstream ss(theSourceString); // Insert the string into a stream 

     while (ss >> aBuffer) 
     { 
      theTokens.push_back(aBuffer); 
     } 
     return; //? 
    } 

    // Skip delimiters at beginning. 
    std::string::size_type aLastPosition = theSourceString.find_first_not_of(theDelimiter, 0); 

    // Find first "non-delimiter". 
    std::string::size_type aPosition = theSourceString.find_first_of(theDelimiter, aLastPosition); 

    while (aPosition != std::string::npos || aLastPosition != std::string::npos) 
    { 
     // Found a token, add it to the vector. 
     theTokens.push_back(theSourceString.substr(aLastPosition, aPosition - aLastPosition)); 

     // Skip delimiters. Note the "not_of" 
     aLastPosition = theSourceString.find_first_not_of(theDelimiter, aPosition); 

     // Find next "non-delimiter" 
     aPosition = theSourceString.find_first_of(theDelimiter, aLastPosition); 
    } 
} 

使用例:

std::vector<std::string> tokens; 
Tokenize("{ 1, 2, 3, 4, 5 }", tokens, "{}, "); 
0

我有了一堆的字符串處理方法,這個工具類。我將顯示用分隔符分割字符串的類函數。這個類有私有構造函數,所以你不能創建這個類的實例。所有的方法都是靜態方法。

Utility.h

#ifndef UTILITY_H 
#define UTILITY_h 

// Library Includes Here: vector, string etc. 

class Utility { 
public: 
    static std::vector<std::string> splitString(const std::string& strStringToSplit, 
               const std::string& strDelimiter, 
               const bool keepEmpty = true); 

private: 
    Utility(); 
}; 

Utility.cpp

std::vector<std::string> Utility::splitString(const std::string& strStringToSplit, 
               const std::string& strDelimiter, 
               const bool keepEmpty) { 
    std::vector<std::string> vResult; 
    if (strDelimiter.empty()) { 
     vResult.push_back(strStringToSplit); 
     return vResult; 
    } 

    std::string::const_iterator itSubStrStart = strStringToSplit.begin(), itSubStrEnd; 
    while (true) { 
     itSubStrEnd = search(itSubStrStart, strStringToSplit.end(), strDelimiter.begin(), strDelimiter.end()); 
     std::string strTemp(itSubStrStart, itSubStrEnd); 
     if (keepEmpty || !strTemp.empty()) { 
      vResult.push_back(strTemp); 
     } 

     if (itSubStrEnd == strStringToSplit.end()) { 
      break; 
     } 

     itSubStrStart = itSubStrEnd + strDelimiter.size(); 
    } 

    return vResult;  
} 

Main.cpp的 - 使用

#include <string> 
#include <vector> 
#include "Utility.h" 

int main() { 
    std::string myString("Hello World How Are You Today"); 

    std::vector<std::string> vStrings = Utility::splitString(myString, " "); 

    // Check Vector Of Strings 
    for (unsigned n = 0; n < vStrings.size(); ++n) { 
     std::cout << vStrings[n] << " "; 
    } 
    std::cout << std::endl; 

    // The Delimiter is also not restricted to just a single character 
    std::string myString2("Hello, World, How, Are, You, Today"); 

    // Clear Out Vector 
    vStrings.clear(); 

    vStrings = Utility::splitString(myString2, ", "); // Delimiter = Comma & Space 

    // Test Vector Again 
    for (unsigned n = 0; n < vStrings.size(); ++n) { 
     std::cout << vStrings[n] << " "; 
    } 
    std::cout << std::endl; 

    return 0; 
}