2011-08-28 76 views
0

假設我有以下文字:如何從文件中讀取消息,只修改單詞?

My name is myName. I love 
stackoverflow . 
Hi, Guys! There is more than one space after "Guys!" 123 
And also after "123" there are 2 spaces and newline. 

現在我需要閱讀這個文本文件,因爲它是。只需要使用字母數字單詞進行一些操作。之後,我必須用改變的文字打印它,但空格,換行符和標點不變,並且位置相同。更改字母數字字時長度保持不變。我試圖用庫檢查字母數字值,但代碼變得非常混亂。有沒有其他辦法?

+3

另一個什麼讀?你是如何解決這個問題的,對你來說什麼是「混亂」? – littleadv

回答

0

你可以用fgets()函數逐行讀取你的文件。它將填充字符數組,你可以使用這個數組,例如迭代這個數組,將它分解成alnum單詞;更改單詞,然後用「fwrite()」函數將固定字符串寫入新文件。

如果您更喜歡C++使用文件(iostream)的方式,則可以使用istream::getline。它將節省空間;但它會消耗「\ n」。如果您甚至需要保存「\ n」(有時可能是'\ r'和'\ r \ n'),您可以使用istream::get

+0

這是C++。爲什麼是C路? –

+0

因爲這是可能的。 – osgx

0

也許你應該看看Boost Tokenizer。它可以將一個字符串分解爲一系列的標記並遍歷它們。下面的示例打破了一個短語,單詞:

int main() 
{ 
    std::string s = "Hi, Guys! There is more..."; 
    boost::tokenizer<> tok(s); 
    for(boost::tokenizer<>::iterator beg = tok.begin(); beg != tok.end(); ++beg) 
    { 
     std::cout << *beg << "\n"; 
    } 

    return 0; 
} 

但在你的情況,你需要提供一個TokenizerFunc,將打破串在字母/非字母數字界限。

欲瞭解更多信息,請參閱Boost Tokenizer已提供的char_separator,offset_separator和escaped_list_separator的文檔和實現。

0

您的代碼變得混亂的原因通常是因爲您沒有在清晰的函數和類中分解您的問題。如果你這樣做,你會有幾個功能,每個功能都只是做一件事(而不是雜亂)。然後你的main函數就會調用這些簡單的函數。如果函數名稱選擇得當,main函數也會變得簡短和清晰。

在這種情況下,您的主要功能需要做:

  • 循環:讀取文件
  • 的每行每行上,檢查並在出現「特殊」二字。
  • 如果出現一個特殊的詞,取代它

額外提示:一行文本可以被存儲爲std::string,並且可以通過std::getline(std::cin, line)