c++ - 读取文件时宏定义的有效方法?

标签 c++ regex string macros io

问题描述:

我想要这个效果。我正在使用 C++ 读取输入文件。我想以这种方式设计我的输入文件:

....blahblah.....
Define Length 20
Node ($Length 0.1 0.1)
....blahblah.....

因此 $Length 将自动替换为 20。

我正在考虑更一般的情况:比如给定一个任意字符串

Node ($strLengthUnknown 0.1 0.1)

我会先将整个字符串拆分成单词,然后查找是否有某些单词以 $ 符号开头,然后进行替换。

我的问题:

我想知道有没有更聪明的方法?我不想重新发明轮子。因此,如果您知道已经有更好的方法/库可以做到这一点,请告诉我。谢谢

最佳答案

你可以拆分字符串——这个问题已经被问过很多次了: Split a string in C++? 然后,您可以搜索单词并进行替换。

但是,更简单的方法是搜索“$”符号并检查“$”之前的前一个字符是否不属于单词 - 在您的示例中为空格或括号。我不了解您文件的全部语法,但在我们寻找以字母开头的标识符的情况下,检查“$”之后的下一个字符就足够了。

    string x = "Node ($Length 0.1 0.1)";
    size_t len = x.length();
    size_t pos = 0;
    while((pos = x.find("$",pos)) != string::npos) {
        if(pos == 0 || isspace(x[pos-1]) || x[pos-1] == '(') {
            if(pos != (len -1) &&  isalpha(x[pos+1])) {
                //find the length of word, starting from pos
                //do the replacement, update pos
                x.replace(pos,word_length,string_to_replace);
                pos += word_length;
            } else {
                ++pos;
            }
        } else {
            ++pos;
        }
    }

关于c++ - 读取文件时宏定义的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22277845/

相关文章:

c++ - 如何使用绑定(bind)的连接和监听套接字测试 winsock 应用程序?

c++ - QNetworkAccessManager,重置 TCP 连接

c++ - 带有空格的 yaml-cpp 格式映射

c++ - 我会产生内存泄漏吗? C++,指针新建/删除

javascript - 帮助使用 JavaScript 正则表达式

python - 正则表达式匹配字符串后跟任何单词后跟字符串变量

java - 来自属性文件 : Java 的字符串主机名

javascript - 正则表达式匹配不同数量的单词

java - 在 Java 中,如何检查字符串是否包含子字符串(忽略大小写)?

java - 如何用一个空行替换多个空格和换行符