我怎样才能读取与性病:: fstream的文本文件时使用非默认分隔符?(How can I use

2019-06-24 01:28发布

在我的C ++代码,我想从一个文本文件(* .txt)的阅读和标记化的每个条目。 更具体地说,我希望能够从文件中读取单个的单词,如“格式”,“叠加”,“杰森”,“欧洲”, 等等

我选择使用fstream来执行这项任务,我不知道如何设置它的分隔符来我想用(空间,那些\n ,以及连字符和撇号,甚至如“Mcdonal的”)。 我想通空间和\n是默认分隔符,但连字符都没有,但我希望把他们作为分隔符,这样解析文件时,我要进去的话“等等等等XXX动物-猫”作为简单的“嗒嗒” , “嗒嗒”, “XXX”, “动物”, “猫”。

也就是说,我希望能够从“堆栈溢出”,“你”, 拿到两个字符串并且仍然能够保持\n和空间,在同一时间分隔符。

Answer 1:

一个IStream把“空白”作为分隔符。 它使用的语言环境来告诉它哪些字符是空白。 语言环境,反过来,包括CTYPE facet进行分类字符类型。 这样的小会是这个样子:

#include <locale>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <sstream>

class my_ctype : public
std::ctype<char>
{
    mask my_table[table_size];
public:
    my_ctype(size_t refs = 0)  
        : std::ctype<char>(&my_table[0], false, refs)
    {
        std::copy_n(classic_table(), table_size, my_table);
        my_table['-'] = (mask)space;
        my_table['\''] = (mask)space;
    }
};

和一个小测试程序,以显示它的工作原理:

int main() {
    std::istringstream input("This is some input from McDonald's and Burger-King.");
    std::locale x(std::locale::classic(), new my_ctype);
    input.imbue(x);

    std::copy(std::istream_iterator<std::string>(input),
        std::istream_iterator<std::string>(),
        std::ostream_iterator<std::string>(std::cout, "\n"));

    return 0;
}

结果:

This
is
some
input
from
McDonald
s
and
Burger
King.

istream_iterator<string>使用>>阅读从流个体线,因此,如果您直接使用它们,你应该得到相同的结果。 您需要的部分,包括正在创建的语言环境和使用imbue ,使流使用该语言环境。



Answer 2:

您可以使用

istream::getline(char* buffer, steamsize maxchars, char delim)

虽然这仅支持单个分隔符。 要在不同的分隔符进一步分割线,你可以使用

char* strtok(char* inString, const char* delims)  

这需要多个定界符。 当您使用的strtok,你只需要通过它的缓冲区中的第一次的地址 - 之后,仅仅通过在一个空,它会给你最后一个是给你的下一个标记,当没有返回一个空指针更多。

编辑:一个具体的实施会是这样的

char buffer[120]; //this size is dependent on what you expect the file to contain
while (!myIstream.eofbit) //I may have forgotten the exact syntax of the end bit
{
    myIstream.getline(buffer, 120); //using default delimiter of \n
    char* tokBuffer;
    tokBuffer = strtok(buffer, "'- ");
    while (tokBuffer != null) {
        cout << "token is: " << tokBuffer << "\n";
        tokBuffer = strtok(null, "'- "); //I don't need to pass in the buffer again because it remembers the first time I called it
    }
}


文章来源: How can I use non-default delimiters when reading a text file with std::fstream?