2013-08-22 20 views
0

因此,我現在用C++做了大約3個月的算法,作爲一種愛好。我從來沒有遇到過直到現在都無法解決的問題。我試圖從一個文本文件中讀取,該文件將被轉換爲一個哈希表,但是當我嘗試從文件中捕獲數據時,它會在一個空格處結束。這裏的代碼將文本存儲到包含空格的文件中的字符串

#include <iostream> 
#include <fstream> 

int main() 
{ 
    using namespace std; 
    ifstream file("this.hash"); 
    file >> noskipws; 

    string thing; 
    file >> thing; 
    cout << thing << endl; 

    return 0; 
} 

我知道了noskipws標誌的,我只是不知道如何正確地執行它

+0

'noskipws'只是意味着前面的空白將被列入,因此,例如,'hello'將被讀爲hello',不'hello'。它沒有做任何關於閱讀'你好弗雷德'。 (沒有格式化,但希望你能明白) – Dave

+0

實際上,如果讀取一個字符串停止在空白處,那麼你可能會發現設置'noskipws'使它在任何情況下都不會看到任何內容,因爲它會立即找到一個終止字符。 – Dave

+0

你想如何加載文本文件?一次一行?爲'std :: getline'嘗試'getline' –

回答

2

我認爲你正在試圖做什麼是最好的工具是getgetlineread。現在所有的緩衝區都使用char緩衝區而不是std::string,所以需要多加思考,但它們確實很簡單。 (編輯:std::getline(file, string),正如DietmarKühl所指出的那樣,使用C++字符串而不是字符緩衝區,所以我實際上會推薦這種方式,那麼你不需要擔心最大行長度)

下面是一個例子,整個文件:

#include <iostream> 

int main() { 
    char buffer[1024]; // line length is limited to 1023 bytes 

    std::ifstream file("this.hash"); 

    while(file.good()) { 
     file.getline(buffer, sizeof(buffer)); 
     std::string line(buffer); // convert to c++ string for convenience 
     // do something with the line 
    } 

    return 0; 
} 

(注意,線路長度被限制在1023個字節,如果線路較長,將被分成2讀取當它是一個真正的換行,你會看到一個\n字符在字符串末尾)

當然,如果你的文件的最大長度是adv因此,您可以相應地設置緩衝區並取消循環。如果緩衝區需要非常大(超過幾千字節),則應該使用new char[size]delete[]而不是靜態數組,以避免堆棧溢出。

,這裏是一個參考頁:http://www.cplusplus.com/reference/fstream/ifstream/

+0

你是一個聖人,非常感謝你 –

3

當使用格式化輸入運營商std::string它總是停在流考慮什麼成爲空格。使用std::locale的字符分類方面std::ctype<char>可以重新定義空間的含義。不過,這有點牽扯。

如果你想閱讀到一個特定的分隔符,你可以使用std::getline(),可能指定分隔您有興趣,例如:

std::string value; 
if (std::getline(in, value, ',')) { ... } 

讀取字符,直到它找到一個逗號或將結束文件已到達並將字符存儲到分隔符value中。

如果你只是想讀取整個文件,其中一個辦法就是使用

std::ifstream in(file.c_str()); 
std::string all((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>()); 
+0

+1。我沒有意識到 – Dave

+0

感謝你的'std :: getline'分隔符參數,沒有意識到這是一個額外的參數 –

相關問題