Я делаю одну программу с C ++, и эта программа должна быть лексическим анализатором для создания компилятора. Таким образом, я создал заголовок «AnalisadorLexical.h», в котором я определяю все функции и все другие вещи как указатели на файлы …, «AnalisadorLexical.cpp», где я определяю логические функции и main.cpp.
В main.cpp я прошу пользователя ввести имя файла для анализа и имя для записи результата. Это делается внутри цикла, в то время как для этого пользователь вводит много файлов для анализа.
Когда пользователь вводит имя файла шрифта и имя окончательного файла, я использую функцию fopen дважды, чтобы открыть первый файл и записать второй. После этого я вызываю конструктор, чтобы получить размер первого файла для создания вектора, в котором я буду хранить токены файла.
Моя проблема в том, когда я использую fseek, чтобы получить размер файла. Выполнение программы не удалось, и я не знаю, что делать.
Следует своему коду
main.cpp:
`int main () {
char *c1, *c2;
c1 = new char[30];
c2 = new char[30];
FILE *f1;
FILE *f2;
cout<<"Arquivo de entrada:"<<endl;
while(cin>>c1){
cin>>c2;
f1 = fopen(c1, "r");
f2 = fopen(c2, "w");
AnalisadorLexico al(f1, f2);
al.analiseLexica();
fclose(f1);
fclose(f2);
}
вернуть 0;
} `
AnalisadorLexico.cpp — конструктор:
`
AnalisadorLexico :: AnalisadorLexico (ФАЙЛ * f1, ФАЙЛ * f2) {
//Aloca os arquivos
fp = f1;//arquivo sendo lido (de entrada)
fs = f2;//arquivo de saída
//tamanho do arquivo
fseek(fp, 0L, SEEK_END);
tk_Size = ftell(fp);
//vetor de tokens
tk_vet = new token[tk_Size];
//inicializa com 0
tk_count = 0;
monta_tabelaPR();
montaSb_vet();
} (…)
`
AnalisadorLexico.h — определение конструктора
`
(…)
общественности:
//Construtor de classe
AnalisadorLexico(FILE *f1, FILE *f2);
(…)
`
Спасибо за вашу помощь, ребята.
Вам нужно проверить возвращаемое значение fopen
, Если есть ошибка, вам нужно сделать что-то вменяемое. Кроме того, почему не с1 и с2 std::string
s?
Я не стал бы пытаться найти размер файла. Тем не менее, я также не буду вставлять его в выделенную вручную память. Вместо этого я просто прочитал бы это в std::vector<char>
и приступить к работе, которую я на самом деле должен был сделать:
std::vector<char> v;
{
std::ifstream in(c1);
if (!in) {
throw std::runtime_error("failed to open '" + std::string(c1) "' for reading");
}
v.insert(std::istreambuf_iterator<char>(in), std::istreambuf_iterator<char>());
}