作为解析文件的一部分,我的任务涉及剥离文件中的所有注释,然后解析文件。解析完成后,我需要将注释插回到同一行。
要删除评论,我会阅读该文件并检查评论是否已发生,然后在那里输入换行符。我使用Ragel来做到这一点,逻辑工作正常。
example: file.cpp
#1 /** comments */
#2 /** comments */
#3
#4 ABCD : XYZ, 123
#5 EFGH : ABC, 987
intermediate_file.cpp
#1
#2
#3
#4 ABCD : XYZ, 123
#5 EFGH : ABC, 987
注释与行号一起存储在std::map<int,string>
中,稍后用于迭代并将字符串输出到文件intermediate_file.cpp
。我使用以下代码:
fstream m_fstr; //class member
std::map<int,std::string> m_Comments_map; //to hold the comments
void WriteBackCommentsToFile(void) {
m_fstr.open("intermediate_file.cpp", ios_base::out);
int LineNbr = 0;
for(std::map<int,std::string>::iterator it = m_Comments_map.begin(); it != m_Comments_map.end(); ++it) {
LineNbr = it->first;
if(m_fstr.is_open()) {
m_fstr.seekg(std::ios::beg);
GotoLine(m_fstr,LineNbr );
m_fstr << it->second << endl;
}
}
}
std::fstream& GotoLine(std::fstream& file, unsigned int num){
for(int i=0; i < num - 1; ++i){
file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
//getline(m_fstr,ReadLine); -- another try
}
return file;
}
解析完成后,我正在尝试将m_Comments_map
的评论写回文件intermediate_file.cpp
通过上述逻辑,我只能打印文件中的第一行 - /** comments */
。其余内容不会写回文件。
我已尝试将std::map
的内容打印到控制台,并验证评论是否已正确存储在std::map
中。问题在于将std::map
内容打印到文件中。有谁能告诉我我的代码的哪一部分不正确。?
我使用此处描述的逻辑实现了上述内容: In C++ is there a way to go to a specific line in a text file?