2014-02-26 12 views
0
class Read 
{ 
public: 
    Read(const char* filename) 
    :mFile(filename) 
    { 

    } 
    void setString() 
    { 
     while(getline(mFile, str, '.')) 
     { 
      getline(mFile, str, '.'); 
      str.erase(std::remove(str.begin(), str.end(), '\n'), str.end()); 
     } 

    } 
private: 
    ifstream mFile; 
    string str; 
}; 


int main() 
{ 
    Read r("sample.txt"); 
    return 0; 
} 

我的最終目標是解析文件中的每個句子,所以我使用getline將分隔符設置爲'。'。得到每個單獨的句子。我想創建一個語句向量,但我不知道如何去做。創建單獨解析句子的向量C++

該文件非常大,所以它會有很多句子。如何爲每個句子創建一個向量?

它只是簡單的矢量< string> str?它將如何知道尺寸?

編輯:我添加了一行代碼刪除「\ n」 編輯:!擺脫EOF

+1

它不會知道大小,當你push_back一個字符串,如果它的大小不夠,向量將爲新字符串分配更多的內存。 –

+0

那麼,你想要做的是嗎?顯然,你有一個包含所有句子的「vector」,而不是每個句子的「vector」,但是如果你確實需要後者,你需要指定分割句子的規則。 –

回答

1
#include <vector> 
using namespace std; 

... 

vector<string> sentences; 
sentences.push_back(line); 

的載體是一個動態數組,當你不斷增加的句子也將調整自身。如果你知道句子的數量,你可以通過調用提高性能:

sentences.resize(number of sentences here) 
+0

謝謝你的解釋 – user3239138

2
while(!myFile.eof()) 
     getline(mFile, str, '.'); 

你在哪裏找到的?請把它放回去。嘗試:

std::vector<std::string> sentences; 

while(std::getline(mFile, str, '.')) 
    sentences.push_back(str); 

vector容器具有.size()函數返回填充元素的數量。你應該谷歌「標準::矢量」,並閱讀API中的功能。

+0

我從我的教科書中得到它。感謝您的更正 – user3239138

+0

@ user3239138:yikes - 老實說*糟糕*。只有在嘗試輸入文件並遇到文件結尾後纔會在流中設置'eof()'狀態...假設您的文件包含「abc \ n」,那麼第一個'getline'調用將讀取「abc」 eof'不會被設置,那麼第二個'getline()'將失敗並且設置'eof()'。如果你在調用'getline'之前和獨立於'getline'測試'eof',並且不測試getline'本身的成功,你會得到錯誤的印象,即第二個'getline'調用在文件中找到第二行。 –

2

向量是dynamica陣列。您無需擔心矢量的大小。您可以使用push_back()函數在向量中添加元素。我在你的代碼中做了一些改變。請檢查這個工作是否適合你..

#include<vector> 
using namespace std; 
class Read 
{ 
public: 
    Read(const char* filename) 
    :mFile(filename) 
    { 

    } 
    void setString() 
    { 
     while(getline(mFile, str, '.')) 
     { 
      vec.push_back(str); 
     } 
    } 
private: 
    ifstream mFile; 
    string str; 
    vector<string> vec; 
}; 
int main() 
{ 
    Read r("sample.txt"); 
    return 0; 
} 
+0

'while(!myFile.eof())'被破壞......只有在嘗試輸入(這裏是'getline')和eof時纔會設置'eof()'。對於文本文件,這意味着只有在試圖讀取文件中沒有換行符分隔符的最後一行時(也可能是空的),它纔會被設置。 –

+0

是的,它的工作。感謝您的解釋 – user3239138

+0

我添加了另一行代碼來擺脫換行符分隔符。那應該沒問題吧? – user3239138