.eof() не распознает конец файла после .seekg(0, ios::просить) | C

#c #c 11 #binaryfiles #eof #seek

Вопрос:

Я использую двоичные файлы с fstream, поэтому, прочитав начало нового цикла, я использую .eof() для завершения функции. Однако мне нужно прочитать этот файл несколько раз, поэтому каждый раз, когда я вызываю функцию, я использую .найдите(0, ios::просить), чтобы «перемотать» файл. Проблема в том, что после того, как я это сделаю,. eof() перестанет работать в этой функции, что приведет к бесконечному циклу.

 void iteracionTest(ifstreamamp; binCond, ifstreamamp; binFalt, ofstreamamp; archReporte){
    int licencia;
    while(1){
        binCond.read(reinterpret_cast<char*>(amp;licencia), sizeof(int));
        if(binCond.eof())break;
        leerImprimirBinCond(binCond, archReporte, licencia);
        leerImprimirBinFalt(binFalt, archReporte, licencia);
    }
}
 

Это как раз то место, где я вызываю проблемную функцию.

 void leerImprimirBinFalt(ifstreamamp; binFalt, ofstreamamp; archReporte, int licencia){
    char placa[20], gravedad[20];
    int binLicencia, dd, mm, yy, codigo;
    double multa;
    binFalt.seekg(0, ios::beg);
    while(1){
        binFalt.read(reinterpret_cast<char*>(placa), sizeof(char)*20);
        if(binFalt.eof())break;
        binFalt.read(reinterpret_cast<char*>(amp;binLicencia), sizeof(int));
        binFalt.read(reinterpret_cast<char*>(amp;dd), sizeof(int));
        binFalt.read(reinterpret_cast<char*>(amp;mm), sizeof(int));
        binFalt.read(reinterpret_cast<char*>(amp;yy), sizeof(int));
        binFalt.read(reinterpret_cast<char*>(gravedad), sizeof(char)*20);
        binFalt.read(reinterpret_cast<char*>(amp;codigo), sizeof(int));
        binFalt.read(reinterpret_cast<char*>(amp;multa), sizeof(double));
    }
}

 

При отладке вместо остановки «место» продолжало заполняться пустыми символами. И по какой-то причине это отлично сработало при первом вызове функции, но после этого она больше не работает.

Что меня убивает, так это то, что я использовал тот же метод для другой программы, и каким-то образом он отлично работает.

     binAlu.seekg(0, ios::beg);
    while(1){
        binAlu.read(reinterpret_cast<char*>(amp;codigo), sizeof(int));
        if(binAlu.eof())break;
        binAlu.read(reinterpret_cast<char*>(name), sizeof(char)*50);
        binAlu.read(reinterpret_cast<char*>(amp;tipo), sizeof(char));
        binAlu.read(reinterpret_cast<char*>(amp;carne), sizeof(int));
        binAlu.read(reinterpret_cast<char*>(facultad), sizeof(char)*10);
        binAlu.read(reinterpret_cast<char*>(especialidad), sizeof(char)*30);
    }
 

Чтобы это сработало, мне пришлось вместо этого рассчитать количество регистров в файле и использовать для того, чтобы вручную сосчитать до конца файла.

 void leerImprimirBinFalt(ifstreamamp; binFalt, ofstreamamp; archReporte, int licencia){
    char placa[20], gravedad[20];
    int binLicencia, dd, mm, yy, codigo, tamano=sizeof(char)*40 sizeof(int)*5 sizeof(double), tamanoA, cant, i;
    double multa;
    binFalt.seekg(0, ios::end);
    tamanoA=binFalt.tellg();
    binFalt.seekg(0, ios::beg);
    cant=tamanoA/tamano;
    for(i=0; i<cant; i  ){
        binFalt.read(reinterpret_cast<char*>(placa), sizeof(char)*20);
        binFalt.read(reinterpret_cast<char*>(amp;binLicencia), sizeof(int));
        binFalt.read(reinterpret_cast<char*>(amp;dd), sizeof(int));
        binFalt.read(reinterpret_cast<char*>(amp;mm), sizeof(int));
        binFalt.read(reinterpret_cast<char*>(amp;yy), sizeof(int));
        binFalt.read(reinterpret_cast<char*>(gravedad), sizeof(char)*20);
        binFalt.read(reinterpret_cast<char*>(amp;codigo), sizeof(int));
        binFalt.read(reinterpret_cast<char*>(amp;multa), sizeof(double));
    }
}
 

Я что-то упускаю?

Комментарии:

1. вы должны очистить bad штат, иначе seekg это не сработает.

2. На заметку, подобный код while(1){ binCond.read(...); if(binCond.eof()) break; ... } должен быть переписан как while (binCond.read(...)) { ... }