2016-03-09 116 views
0

我試圖從一個文件讀取,基本上我的文本文件是這樣的;從文件讀取C++不起作用

23 4 * 19 2 - + # 
6 3 - # 
36 # 

我想通過忽略文件末尾的#來讀取文件。我不想拿#。之後,我想將它存儲在我的隊列中。這是我的代碼的一部分,像這樣;當我顯示我的隊列時,仍然需要#。我無法弄清楚爲什麼。我會很高興,如果你幫我

while (!myFile.eof()) { 
     getline(myFile, a, ' '); 
     if (a != str4) { 
      q.enqueue(a); 
     } 
     else { 
      cout << " " << endl; 
     } 
    } 
    q.display(cout); 
+3

如何使用getline(myFile,a,'#'); ? – kvr

+2

使用'!myFile.eof()'作爲循環條件似乎不太好。嘗試'while(getline(myFile,a,'')){'並在循環內移除getline。 (我發表評論,因爲我沒有測試這個) – MikeCAT

+0

你考慮過正則表達式嗎?它可以幫助您在@kvr – Saleem

回答

-1

您可以清理使用正則表達式您的數據:

std::smatch _match; 
    std::regex line_regex("(.*)#"); 

    string line; 

    while(getline(myfile,line)) 
    { 
     std::regex_search(line, _match, line_regex); 
     if (_match.size() > 0) 
     { 
      cout << _match[1].str() + "\n"; 
     } 
    } 

正則表達式會忽略#後的任何東西。基於文件的樣本內容,輸出將是

輸入內容:

23 4 * 19 2 - + # 
6 3 - # 23244 
36 # 

輸出:

23 4 * 19 2 - + 
6 3 - 
36 
+0

數據看起來像輸入到後綴計算器 - 典型的學生作業。我不知道學生在課程的這個階段是否已經學會了正則表達式。 –

+0

因此,這裏的建議是使用正則表達式來檢測以'#'結尾的行?肯定是矯枉過正。 'std :: string :: find'可以完成同樣的事情,沒有任何開銷。 –

+0

@PeteBecker,全力以赴。問題不是什麼是檢測特定行尾字符的最佳或高性能方法。正則表達式是提供上述問題OP解決方案的衆多工具之一。在這種特殊情況下,Regex可能不是一個好選擇,但看到它的靈活性。 – Saleem

0

一個簡單的方法是將讀出的文本行成一個字符串。接下來找到#符號並擦除#後面的字符串中的所有字符。

std::string test_string = "help fred # not fred.\n"; 
const std::string::size_type position = test_string.find_first("#"); 
test_string.erase(position, test_string.length() - position); 
std::cout << "After truncation, string is: " << test_string << "\n";