C++ 读取文件时宏定义的有效方法? 问题描述:

C++ 读取文件时宏定义的有效方法? 问题描述:,c++,regex,string,macros,io,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) 我首先将整个字符串拆分为单词,然后查找是否有以$sign开头的单词,然后进行替换 我的问题: 我想知道有没有更聪明的

我想要这个效果。我用C++来读取输入文件。我想用以下方式设计输入文件:

....blahblah.....
Define Length 20
Node ($Length 0.1 0.1)
....blahblah.....
因此,
$Length
将自动替换为20

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

Node ($strLengthUnknown 0.1 0.1)
我首先将整个字符串拆分为单词,然后查找是否有以$sign开头的单词,然后进行替换

我的问题:
我想知道有没有更聪明的方法?我不想重新发明轮子。所以,如果你知道有更好的方法/图书馆可以做到这一点,请告诉我。谢谢

您可以拆分字符串-这个问题已经被问过很多次了: 然后,您可以搜索单词并进行替换

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

    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预处理器本身。您可以在文件中使用标准预处理器指令,然后通过前处理器运行文件,然后使用预处理器的输出

这将取决于输入文件的实际文本,以及C预处理器将输入文件中的某些文本解释为预处理器指令是否存在问题

这也提供了一些替代方案

或者