使用正则表达式迭代器与char *

Using regex iterator with char *

本文关键字:char 迭代器 正则表达式      更新时间:2023-10-16

我试图将文件读取到缓冲区中,然后使用regex迭代器。我知道我可以使用一个c++字符串迭代器与regex迭代器(构造函数是std::regex_iterator<std::string::iterator>),但我想避免复制我的缓冲区到一个字符串,并继续使用低级函数读取文件(现在我使用open()read())。

struct stat buff;
int file = open(argv[1], O_RDONLY);
if(!file)
    cout << "Error opening file" << endl;
else if(fstat(file, &buff))
    cout << "Error" << endl;
else
{
    cout << (buff.st_size) << endl;
    char fr[buff.st_size+1];
    read(file, fr, buff.st_size); // using string::c_str() or string::data() didn't work
    fr[buff.st_size] = '';
    // then use regex iterator to iterate through matches
}
close(file);

我认为我的选择是找到一种方法来使用read()与c++字符串而不是char *或一种方法来使用字符数组上的正则表达式迭代器。我可以写一个,但我也尽量保持我的程序尽可能小。

有办法吗?我如何使用c++字符串作为C字符* (read())?

只用std::regex_iterator<char*>。指针本身就是一个很好的双向迭代器。另外,避免在堆栈上分配一个大的字符数组,它可能会溢出。相反,使用堆:

std::unique_ptr<char[]> fr = new char[buff.st_size + 1];

如果您想使用std::string,您可以简单地将字符串的第一个元素的地址传递给read()函数,像这样:

    struct stat buff;
    int file = open(argv[1], O_RDONLY);
    if(!file)
        cout << "Error opening file" << endl;
    else if(fstat(file, &buff))
        cout << "Error" << endl;
    else
    {
        cout << (buff.st_size) << endl;
//      char fr[buff.st_size+1];
        std::string fr; // use a std::string
        fr.resize(buff.st_size); // resize it to create internal buffer
        read(file, &fr[0], fr.size()); // this should work
//      read(file, fr, buff.st_size); 
//      fr[buff.st_size] = '';
        // then use regex iterator to iterate through matches
    }
    close(file);