2016-09-24 101 views
1

嘿大家這是我的第一篇文章,所以如果我犯了任何錯誤,如沒有足夠的信息等,請讓我知道,所以我不再讓他們。while循環退出後,字符串的內容被刪除?

所以我的問題是我需要採取一個文件的內容,然後將它們輸入到一個字符串,我有工作。然而,在while循環結束後,如果我嘗試在while循環外使用該字符串並處理字符串的內容。字符串是空白的,似乎沒有內容。我通過使用std :: cout行來確定這一點。我相信這是一個範圍問題,但我不知道如何解決它。以下是有關該問題的代碼,任何提示或幫助將不勝感激!

std::string str; 
std::ifstream file; 

while(!file.eof()){ 
getline(file, str); 
std::cout << str << ""; 

} 

file.close(); 

std::cout << str << ""; 

std::map<std::string, int> map; 

for(int i = 0; i < str.length(); ++i){ 

    std::string sub = str.substr(i, k); 

    std::cout << sub << std::endl; 

    map.insert(make_pair(sub, 1)); 

    } 

    std::cout << "" << std::endl; 

此外,我試圖向上斬串入大小k它是在代碼的不同部分中定義的變量,所以我用C++中的SUBSTR方法,相信這是工作,因爲當我把它放在while循環中,我可以打印出文件的內容,但格式是關閉的,我認爲這是因爲while循環運行的性質,但我不確定,如果我錯了,請糾正我或有任何誤解。

+0

一個明顯的錯誤,你不應該再犯的是,所示的代碼不能滿足所有的[MCVE]的要求。 –

+0

好吧,我只是通讀該文檔,我明白,謝謝你的指針! – firetiger443

回答

1

那豈不是更容易的文本文件存儲到一個std::vector,然後選擇什麼你想要操縱的句子? 例子:

int main() 
{ 
    std::string str; 
    std::ifstream file{ "file.txt" }; 
    std::vector<std::string> vec; 

    // Store text file in vector 
    while (std::getline(file, str)) { 
     vec.emplace_back(str); 
    } 

    // Print out line 2: 
    std::cout << vec.at(1) << '\n'; 

    // Reverse line 2 and print: 
    std::string line2 { vec.at(1) }; 
    std::reverse(begin(line2), end(line2)); 
    std::cout << line2 << '\n'; 
} 
+0

我真的從來沒有想過這一點,因爲我現在正在開發的程序幾乎已經完成了,但是我會在嘗試一個向量實現之後進行更多的練習,還有其他原因導致向量比字符串更好/更容易案件? – firetiger443

+0

@ firetiger443如果它存儲在向量中,它會讓你選擇你想要處理的文本文件的哪一行。防爆。第4行:'vec.at(5)'等 –

1

您一次只能存儲一行getline(file, str);。我的猜測是你的文件的最後一行是空白的,所以存儲到str的最後一個值是空的。

您可以連接,而不是覆蓋:

std::string temp; 
std::string str; 
std::ifstream file; 

while(!file.eof()){ 
    getline(file, temp); 
    std::cout << str << ""; 
    str = str + temp; 
} 

另外,加#include <fstream>及用途:

std::ifstream inputStream("myfile.txt"); 
std::string str((std::istreambuf_iterator<char>(inputStream), 
       (std::istreambuf_iterator<char>())); 
+1

這工作完美,這是有道理的,我永遠不會猜到,謝謝你的答案! – firetiger443