fopen — открытие файлов и использование fseek для получения размера файла

Я делаю одну программу с 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);

(…)
`

Спасибо за вашу помощь, ребята.

1

Решение

Вам нужно проверить возвращаемое значение fopen, Если есть ошибка, вам нужно сделать что-то вменяемое. Кроме того, почему не с1 и с2 std::strings?

0

Другие решения

Я не стал бы пытаться найти размер файла. Тем не менее, я также не буду вставлять его в выделенную вручную память. Вместо этого я просто прочитал бы это в 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>());
}
0

По вопросам рекламы [email protected]