gpt4 book ai didi

C++ ifstream 函数和字段分隔符

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:13:01 38 4
gpt4 key购买 nike

对于这个程序,我只在 shell 脚本中使用了来自数据文件的字段分隔符。但我正在尝试使用标准库函数 ifstream() 从数据文件中读入。唯一的问题是我这样获取数据

A:KT5:14:行政办公 table :

这是一个哈希表,我需要将数据结构和交易类型行中的值分开。我一直在网上四处寻找,并没有发现太多关于字段分隔符的信息,而且我发现的内容非常困惑。

接下来的问题是,有没有办法用 ifstream 函数设置字段分隔符,或者我应该使用另一个标准库 i/o 函数?

谢谢。

最佳答案

@Steve Townsend 已经指出了一种可能性。如果您更喜欢使用 operator>> 而不是 std::getline,您也可以这样做。 istream 始终将空格视为分隔符。每个流都有一个关联的语言环境,每个语言环境都包含一个 ctype facet。 ctype facet 是 istream 用来确定哪些输入字符是空白的。

在您的情况下,您显然希望流仅将换行符和冒号视为“空白”(即分隔符),而实际的空格字符仅被视为“普通”字符,而不是分隔符。

为此,您可以像这样创建一个 ctype facet:

struct field_reader: std::ctype<char> {

field_reader(): std::ctype<char>(get_table()) {}

static std::ctype_base::mask const* get_table() {
static std::vector<std::ctype_base::mask>
rc(table_size, std::ctype_base::mask());

rc['\n'] = std::ctype_base::space;
rc[':'] = std::ctype_base::space;
return &rc[0];
}
};

要使用它,您必须使用此方面将语言环境“灌输”到流中:

int main() {
std::stringstream input("A:KT5:14:executive desk:");

// have the stream use our ctype facet:
input.imbue(std::locale(std::locale(), new field_reader()));

// copy fields from the stream to standard output, one per line:
std::copy(std::istream_iterator<std::string>(input),
std::istream_iterator<std::string>(),
std::ostream_iterator<std::string>(std::cout, "\n"));
return 0;
}

不过,我首先承认这有一些缺点。首先,locale 和 facet 的文档通常很少,因此大多数 C++ 程序员可能会发现这相当难以理解(尤其是当所有实际工作都“在幕后”进行时,可以这么说).

另一种可能性是使用 Boost Tokenizer .老实说,这需要一些更多的工作来使用——它需要您做一些事情,比如读取一个字符串,然后单独分解它。同时,它有据可查,广为人知,并且更符合人们对如何做这样的事情的先入之见,尽管有额外的复杂性,但很多人可能会发现它更容易理解。

关于C++ ifstream 函数和字段分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4197697/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com