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

Я делаю одну программу на С++, и эта программа должна быть лексическим анализатором, чтобы сделать компилятор. Таким образом, я сделал заголовок "AnalisadorLexical.h", где я определяю все функции и все остальное как указатели на файлы..., "AnalisadorLexical.cpp", где я определяю логику функций и main.cpp.

В main.cpp я прошу пользователя ввести имя файла для анализа и имя для записи результата. Это делается внутри цикла, в то время как для этого пользователь вводит много файлов для анализа. Когда пользователь вводит имя файла шрифта и имя конечного файла, я дважды использую функцию fopen, чтобы открыть первый файл и написать второй. После этого я вызываю конструктор, чтобы получить размер первого файла, чтобы создать вектор, в котором я буду хранить токены файла. Моя проблема заключается в том, что я использую fseek для получения размера файла. Сбой выполнения программы и я не знаю, что делать.

Следует их кодексу.

основной.cpp:

`главный(){

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 — конструктор:

` Анализадорлексико:: Анализадорлексико(ФАЙЛ* 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);

(...) `

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


person user2723557    schedule 28.08.2013    source источник


Ответы (2)


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

person David Schwartz    schedule 28.08.2013
comment
Спасибо, Дэвид! У меня проблема с открытием файла. Я использовал `if (f1 == NULL){ cout‹‹ERROR‹‹endl; } `, чтобы проверять возвращаемое значение и всегда возвращать ERROR. О символах c1 и c2 be chars, потому что я больше знаком с ними. - person user2723557; 28.08.2013
comment
Что говорит документация для fopen, если она возвращает NULL? - person David Schwartz; 28.08.2013

Я бы не стал пытаться найти размер файла. Однако я бы также не стал вставлять его в выделенную вручную память. Вместо этого я просто читал его в 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>());
}
person Dietmar Kühl    schedule 28.08.2013