#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(...)) { ... }