2012-04-24 98 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了解更多指针。