Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 传递字符串参数,从文件读取_C++_Regex - Fatal编程技术网

C++ 传递字符串参数,从文件读取

C++ 传递字符串参数,从文件读取,c++,regex,C++,Regex,我试图在文本中找到regex模式。让我们称之为文本:原始文本。 以下是patternFinder()程序的代码: vector <pair <long,long> >CaddressParser::patternFinder(string pattern) { string m_text1=m_text; int begin =0; int end=0; smatch m; regex

我试图在文本中找到
regex
模式。让我们称之为文本:原始文本。 以下是
patternFinder()
程序的代码:

vector <pair <long,long> >CaddressParser::patternFinder(string pattern)

{


        string m_text1=m_text;
        int begin =0;
        int end=0;
        smatch m;
        regex e (pattern); 



    vector<pair<long, long>> indices;
    if(std::regex_search(m_text1,m,e))
    {
        begin=m.position();
        end=m.position()+m.length()-1;
        m_text1 = m.suffix().str();
        indices.push_back(make_pair(begin,end));
        while(end<m_length&&std::regex_search(m_text1,m,e))
            { 
                begin=end+m.prefix().length()+1;
                end=end+m.prefix().length()+m.length();
                indices.push_back(make_pair(begin,end));
                m_text1 = m.suffix().str();

            }
        return indices;
    }

    else return indices;
}
开头提到的原文是:

  • 路10.01.2013700俄亥俄州西市场街35611asdh
只有粗体文本应该与正则表达式匹配。 现在的问题是,当正则表达式作为从文本文件读取的字符串传递时,
patternFinder()
无法识别该模式。尽管当直接字符串(与文本文件中的字符串相同)作为参数传递给
patternFinder()
时,它仍然有效。 这个问题从何而来

以下是我的
fileReader()
函数的代码,我认为这与提及该函数无关:

string CaddressParser::fileReader(string fileName)
{

    string text;
    FILE *fin;
    fin=fopen(fileName.c_str(),"rb" );
    int length=getLength(fileName);
    char *buffer= new char[length];
    fread(buffer,length,1,fin);
    buffer[length]='\0';
    text =string(buffer);
    fclose(fin);

    return text;

}  

问题可能在于函数从文件中读取字符串。打印读取的字符串,并确保正则表达式被正确读取。

问题可能在于函数从文件中读取字符串。打印读取的字符串并确保正则表达式被正确读取。

问题出在这两行中
缓冲区[长度]='\0'
text=字符串(缓冲区)


buffer[length]应该是buffer[length-1]

问题出在这两行中
缓冲区[长度]='\0'
text=字符串(缓冲区)


缓冲区[长度]应该是缓冲区[长度1 ] < /P> < P>注意到,当将正则表达式直接写入C++代码中并从文件读取时,存在明显的句法差异。

C++中,反斜杠字符具有转义语义,因此要将文字反斜杠放入字符串文字中,必须用反斜杠来避开它本身。因此,要在内存中获取两个字符的字符串

\b
,必须使用字符串文字
“\\b”
。两个反斜杠由C++编译器解释为一个存储在文字中的单反斜杠字符。换句话说,
strlen(\\b”)
是2


P>另一方面,文本文件的内容由程序读取,而不被C++编译器处理。为了将两个字符<代码> >代码>和代码> b>代码>从文件中读取的字符串中,将两个字符串<代码> > b>代码>文件。

注意到,当将正则表达式直接写入C++代码中并从文件读取时,存在明显的句法差异。

C++中,反斜杠字符具有转义语义,因此要将文字反斜杠放入字符串文字中,必须用反斜杠来避开它本身。因此,要在内存中获取两个字符的字符串

\b
,必须使用字符串文字
“\\b”
。两个反斜杠由C++编译器解释为一个存储在文字中的单反斜杠字符。换句话说,
strlen(\\b”)
是2


P>另一方面,文本文件的内容由程序读取,而不被C++编译器处理。因此,要将两个字符
\
b
写入从文件读取的字符串,只需将两个字符
\b
写入文件。

如果您有
char*buffer=new char[length]
,您确实不应该访问
buffer[length]
,它位于数组末尾之后。使其更大:
char*buffer=new char[length+1]
您能显示文件(包含正则表达式的文件)的确切内容吗?我这样问是因为当从文件中读取时,你当然需要单反斜杠而不是双反斜杠。@Angew谢谢你的回答,这就是问题所在。如果你愿意,你可以把你的解决方案写下来作为答案,我可以接受它,这样其他人也可以使用它。@fery Done。但请注意,其他人关于缓冲区大小的评论确实有效-由
新字符[length]
创建的数组具有有效的索引
[0]
[1]
<代码>[length-1]仅限。我得到了很多,但不知何故,当我读取文件时,文件的最后一个字符存储在[length-1]位置,并且将“0”字符存储在[length]位置不会出现任何错误。如果您有
char*buffer=new char[length]
,您确实不应该访问
buffer[length]
,在数组结束之后。使其更大:
char*buffer=new char[length+1]
您能显示文件(包含正则表达式的文件)的确切内容吗?我这样问是因为当从文件中读取时,你当然需要单反斜杠而不是双反斜杠。@Angew谢谢你的回答,这就是问题所在。如果你愿意,你可以把你的解决方案写下来作为答案,我可以接受它,这样其他人也可以使用它。@fery Done。但请注意,其他人关于缓冲区大小的评论确实有效-由
新字符[length]
创建的数组具有有效的索引
[0]
[1]
<代码>[length-1]仅限。我得到了很多,但不知怎么的,当我读取文件时,文件的最后一个字符存储在位置[length-1],而将“0”字符存储在位置[length]不会出现任何错误。您能在自己的PC上运行它吗。因为我一直在将这个fileReader()用于其他目的,它工作得很好。@抱歉,我现在无法运行代码。顺便说一下,艾米尔已经指出了你的错误。你能在自己的电脑上运行吗。因为我一直在将这个fileReader()用于其他目的,它工作得很好。@抱歉,我现在无法运行代码。顺便说一下,艾米尔已经指出了你的错误。
string CaddressParser::fileReader(string fileName)
{

    string text;
    FILE *fin;
    fin=fopen(fileName.c_str(),"rb" );
    int length=getLength(fileName);
    char *buffer= new char[length];
    fread(buffer,length,1,fin);
    buffer[length]='\0';
    text =string(buffer);
    fclose(fin);

    return text;

}