#c #extract #file-handling
Вопрос:
Не удалось найти ошибку:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main () {
string line;
ifstream myfile ("a.h");
vector<vector<string>> vect;
if (myfile.is_open())
{
while (getline(myfile, line) )
{
vector<string> temp;
if (line.substr(0, line.find(" ")) == (string)"int"){
temp.push_back(line.substr(line.find(" ") 1));
}
if (line[0] == '}' amp;amp; line[line.size()-1] == ';')
{
string string_temp = line.substr(1, line.size()-1);
cout << string_temp << endl;
temp.insert(temp.begin(), string_temp);
vect.push_back(temp);
temp.clear();
}
}
myfile.close();
}
else cout << "Unable to open file";
for(auto t : vect){
for(string s : t){
cout << s << " ";
}
cout << endl;
}
return 0;
}
Мне нужно извлечь имя структуры и имена участников из .h
файла;
где a.h
выглядит так:
typedef struct{
int a;
int b;
int c;
}struct_req1_t;
typedef struct{
int d;
int e;
int f;
}struct_rsp1_t;
typedef struct{
int g;
int h;
int i;
}struct_req1_t;
Я подумываю о том, чтобы извлечь имена в виде 2D-вектора:
structure_name1 member1 member2 member3
structure_name2 member1 member2 member3
Комментарии:
1. И в чем же проблема? Вы получаете ошибку компилятора? Пожалуйста, скопируйте и вставьте его в свой вопрос. Разве это не дает желаемого результата? Пожалуйста, укажите выход по току.
2. Если вы реализуете синтаксический анализатор .h, почему бы не использовать существующий: github.com/tree-sitter/tree-sitter или libclang?
3. Подумайте о файле.h как о текстовом файле, и мне придется выполнять операции со строками и файлами, чтобы преобразовать имена в 2D-вектор
4. В этом коде много ошибок. Ваш цикл не учитывает тот факт, что строки , в которых есть
int
поле, начинаются с пробела, поэтомуline.find(" ")
будет возвращать индекс передint
, таким образомline.substr(0, line.find(" ")) == (string)"int"
, всегда будет ложным. Или тот факт, что некоторые строки пусты, таким образомif (line[0] == '}' amp;amp; line[line.size()-1] == ';')
, для этих строк будет неопределенное поведение . Или тот факт, что вместо этогоline.substr(1, line.size()-1)
следует использоватьline.size()-2
, чтобы опустить трейлинг;
из извлеченногоstring
.
Ответ №1:
вы можете использовать cppast : он предоставит вам Абстрактное синтаксическое дерево, и вы сможете извлечь любую информацию из любого файла заголовка. Я успешно использовал его для создания удаленного генератора кода.