2012-04-24 44 views
-3

我想嘗試讀取一個文件在C++中的字符由酒吧分隔「|」, 什麼是最好的方式來做到這一點?閱讀由酒吧分隔的文件C++

謝謝

+1

[你有什麼嘗試?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) – 2012-04-24 06:20:17

+2

歡迎來到StackOverflow。你能提供你描述的輸入樣本嗎?另外,如何在輸入中處理換行符?作爲記錄分隔符,還是作爲字段中的數據? – 2012-04-24 06:20:44

+0

閱讀它就像你會任何其他文件。或者改述你的問題。 – juanchopanza 2012-04-24 06:21:40

回答

4

我假設字段之間用條分隔,但記錄之間用換行符分隔。

首先,在使用std::getline的文本行閱讀:

std::string line; 
std::getline(std::cin, line); 

然後,斷行的|學邊界。

std::stringstream sline(line); 
std::string field; 
std::getline(sline, field, '|'); 
... 
std::getline(sline, field, '|'); 
+0

OP,如果您正在閱讀文件,請使用文件流的名稱而不是cin – Robotnik 2012-04-24 06:25:28

+0

@Robotnik,我同意。另外,如果OP指出這不是作業,我會提出一個更完整的代碼示例。 – 2012-04-24 06:26:56

0

假設你有一個名爲 「FILE.DAT」
它看起來像這樣的文件:

item1|item2|item3|item4|item5|item6 

該程序將打印出的每個項目在文件中:

#include <iostream> 
#include <cstdlib> 
#include <string> 
#include <fstream> 

int main(){ 

    std::ifstream infile("file.dat"); 

    std::string item; 
    getline(infile,item,'|'); 

    while (!infile.eof()){ 
     std::cout << item << std::endl; 
     getline(infile,item,'|'); 
    } 

    return EXIT_SUCCESS; 
} 
+0

我從來不推薦使用'.eof()'作爲循環條件。它幾乎總是產生錯誤的代碼。雖然你的代碼似乎是個例外,但我仍然推薦使用易於閱讀的:'std :: string item; while(std :: getline(infile,item,'|')){std :: cout << item <<「\ n」; }' – 2012-04-24 13:56:37

1

根據對於您使用的代碼的複雜性,您要查找的是CSV(逗號分隔值)文件讀取器的變體。有成千上萬在那裏,如果你的代碼需要強大的,我建議你使用其中的一種,而不是寫自己因爲有複雜如:

  • 如果你的「價值」的一個實際上包含一個'|' 中的字符是什麼引號?
  • 如果您的某個'值'包含回車 或換行符,該怎麼辦?

其中最受歡迎的是Boost tokeniser這應該很容易起牀和使用。你只需要確保你告訴記號器你正在使用'|'作爲現場分隔者。

查看this related question瞭解更多指針。