使用正则表达式迭代器与char *
Using regex iterator with char *
我试图将文件读取到缓冲区中,然后使用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);
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- 使用 map<char,strring> 的迭代器返回指针 map<char,strring>*
- 为什么删除字符串迭代器会产生const char参考
- 调用"替换(std::basic_string<char>::迭代器, std::basic_string::<char>迭代器, char, int)"没有匹配函数|
- 有效的迭代器范围从堆栈上的char
- 从 const char* 到迭代器错误的"无已知转换" - 另一个例子
- 在find_if算法中将 char* 转换为字符串::迭代器
- C++创建一个char*迭代器
- C++ 映射/设置迭代器不可取消引用 --- map<const char *,字符串>
- 将Boost FileSystem3迭代器强制转换为const char*
- 使用正则表达式迭代器与char *