2010-09-15 91 views
4

從一個文本文件,一個字一個字或字符的話我一直在使用Google周圍,並通過我的書,讀書,並努力寫出的代碼通過一個文本文件和進程的話出來的閱讀,一個一個,所以我可以把它們按字母順序排列,並且記下使用了多少單詞和多少單詞。我似乎無法讓我的GetNextWord()函數正常工作,這讓我發瘋。C++讀由焦炭

我需要一個讀取,一個字,每一個字母轉換爲小寫字母如果是大寫。我知道如何做到這一點,並已成功完成。它只是逐字逐字地放入字符串,並把它放到一個支持我的字符串中。

這是我最近嘗試吧:任何幫助將是驚人的或過如何通過字從輸入文件中讀取單詞的教程的鏈接。 (字是字母字符AZ和「(不)用空格,逗號,句號,結束了;,:,ECT ....

void GetNextWord() 
{ 
    string word = ""; 
    char c; 

    while(inFile.get(c)) 
    { 
     while(c > 64 && c < 123 || c == 39) 
     { 
      if((isupper(c))) 
      { 
       c = (tolower(c)); 
      } 
      word = word + c; 
     } 
     outFile << word; 
    } 
} 
+0

輸出問題? – 2010-09-15 04:27:39

+0

另外,將括號放在你的while條件中以明確定義它們。 – 2010-09-15 04:30:44

+5

不使用魔術數字,他們不便攜。使用'A'或'Z'或其他任何39應該是。 – 2010-09-15 04:31:48

回答

3

您的邏輯錯誤。內循環運行只要c不會改變,並且沒有任何內容會改變c

爲什麼你有兩個循環呢?我想你可能會對這個功能是否應該讀取下一個單詞或所有單詞感到困惑。嘗試分離這些問題,將它們放入不同的功能(其中一個叫另一個)。我覺得最簡單的一個自上而下的順序來處理這一問題:

while(inFile.good()) { 
    std::string word = GetNextWord(inFile); 
    if(!word.empty()) 
    std::cout << word << std::endl; 
} 

通過定義GetNextWord()閱讀一切都交給下一個字邊界現在填補空白。

+0

我會試試這個,並且報告我的結果,謝謝 – MSwezey 2010-09-15 20:24:06

+0

謝謝!奇蹟般有效! – MSwezey 2010-09-15 21:00:39

8

您可以通過使用>>操作讀取字的文件字例如,看到此鏈接:

http://www.daniweb.com/forums/thread30942.html我這裏摘錄他們的榜樣:

ifstream in ("somefile"); 
vector<string> words; 
string word 

if (!in) 
    return; 

while (in>> word) 
    words.push_back (word); 
+1

但是,該運算符使用與要求的內容不同的定義。 – sbi 2010-09-15 05:13:25

0

個人而言,我喜歡在輸入與std::getline(std::istream&, std::string&)讀取(在<string>頭,但你當然也需要#include流標題)。

此功能突破上換行,這是你的問題的定義空白。但這不是你問題的完整答案。在閱讀文本行後,您將需要使用string operations或標準算法將字符串分解爲單詞。或者你可以手工循環字符串。

的膽量會是這樣的:

std::string buffer; 
while (std::getline(std::cin, buffer) { 
// break each line into words, according to problem spec 
} 
+0

如果文本中有連字詞,這可能會有問題。 – 2010-09-15 08:38:20

+0

像「back-scatter」這樣的帶連字符的單詞並不重要,因爲問題規範定義了是否將其計爲一個或兩個單詞。但是,如果我正確理解Space_C0wb0y,那麼在下一行連續顯示的單詞將需要比我所顯示的邏輯更多的邏輯。由於這個程序聽起來很像家庭作業,我懷疑這將是有效的輸入,但如果是這樣,那麼就需要處理這樣的輸入。 – 2010-09-15 20:45:16

0

我用

// str is a string that holds the line of data from ifs- the text file. 
// str holds the words to be split, res the vector to store them in. 
while(getline(ifs, str)) 
    split(str, res); 


void split(const string& str, vector<string>& vec) 
{ 
    typedef unsigned int uint; 

    const string::size_type size(str.size()); 
    uint start(0); 
    uint range(0); 

/* Explanation: 
    * Range - Length of the word to be extracted without spaces. 
    * start - Start of next word. During initialization, starts at space 0. 
    * 
    * Runs until it encounters a ' ', then splits the string with a substr() function, 
    * as well as making sure that all characters are lower-case (without wasting time 
    * to check if they already are, as I feel a char-by-char check for upper-case takes 
    * just as much time as lowering them all anyway.          
*/ 
    for(uint i(0); i < size; ++i) 
    { 
     if(isspace(str[i])) 
     { 
      vec.push_back(toLower(str.substr(start, range + 1))); 
      start = i + 1; 
      range = 0; 
     } else 
      ++range; 
    } 
    vec.push_back(toLower(str.substr(start, range))); 
} 

我不知道這是特別有幫助你,但我會盡力。 toLower函數是一個簡單使用:: toLower()函數的快速函數。這會讀取每個字符直到一個空格,然後將其填入向量中。我不完全確定你的意思是char by char。

你想提取由時間單詞字符?還是你想檢查每個人物?或者你的意思是你想提取一個詞,完成,然後回來?如果是這樣,我會1)推薦一個載體,2)讓我知道,所以我可以重構代碼。

+0

我原來的計劃是一次一個字地讀char,一次char字符,當它遇到空格或任何標點符號時,它將停止獲取該單詞,將所有這些字符轉換爲一個字符串並將該字符串發送給我的其他函數以供進一步處理處理。將所有大寫字母轉換爲小寫字母。 IE「不要」會變成「不」。 – MSwezey 2010-09-15 20:17:05

0

這是怎麼回事終止您的內環如果c ==「A」? 「a」的ASCII值爲97.

+0

如果c == a那麼它不會終止內部循環。內部循環終止,如果字符不是A-Z,a-z,並且' – MSwezey 2010-09-15 21:01:48