提问人:OzoPolar 提问时间:9/17/2021 更新时间:9/17/2021 访问量:88
.eof() 无法识别 .seekg(0, ios::beg) 后面的文件末尾 |C++
.eof() doesn't recognize the end of the file after a .seekg(0, ios::beg) | C++
问:
我正在使用 fstream 的二进制文件,因此,在读取新周期的开始后,我使用 .eof() 结束函数。无论如何,我需要多次读取这个文件,所以,每次调用函数时,我都使用 .seekg(0, ios::beg) 来“倒带”文件。问题是,在我这样做之后,.eof() 停止在该函数中工作,导致无限循环。
void iteracionTest(ifstream& binCond, ifstream& binFalt, ofstream& archReporte){
int licencia;
while(1){
binCond.read(reinterpret_cast<char*>(&licencia), sizeof(int));
if(binCond.eof())break;
leerImprimirBinCond(binCond, archReporte, licencia);
leerImprimirBinFalt(binFalt, archReporte, licencia);
}
}
这就是我称之为问题函数的地方。
void leerImprimirBinFalt(ifstream& binFalt, ofstream& 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*>(&binLicencia), sizeof(int));
binFalt.read(reinterpret_cast<char*>(&dd), sizeof(int));
binFalt.read(reinterpret_cast<char*>(&mm), sizeof(int));
binFalt.read(reinterpret_cast<char*>(&yy), sizeof(int));
binFalt.read(reinterpret_cast<char*>(gravedad), sizeof(char)*20);
binFalt.read(reinterpret_cast<char*>(&codigo), sizeof(int));
binFalt.read(reinterpret_cast<char*>(&multa), sizeof(double));
}
}
调试时,“placa”没有停止,而是继续用空白字符填充。出于某种原因,它在第一次调用函数时运行良好,但之后就不再工作了。
杀死我的是,我对另一个程序使用了相同的方法,不知何故,它在那里运行良好。
binAlu.seekg(0, ios::beg);
while(1){
binAlu.read(reinterpret_cast<char*>(&codigo), sizeof(int));
if(binAlu.eof())break;
binAlu.read(reinterpret_cast<char*>(name), sizeof(char)*50);
binAlu.read(reinterpret_cast<char*>(&tipo), sizeof(char));
binAlu.read(reinterpret_cast<char*>(&carne), sizeof(int));
binAlu.read(reinterpret_cast<char*>(facultad), sizeof(char)*10);
binAlu.read(reinterpret_cast<char*>(especialidad), sizeof(char)*30);
}
为了让它工作,我不得不计算文件中的寄存器数量,并使用 for,手动计数到文件末尾。
void leerImprimirBinFalt(ifstream& binFalt, ofstream& 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*>(&binLicencia), sizeof(int));
binFalt.read(reinterpret_cast<char*>(&dd), sizeof(int));
binFalt.read(reinterpret_cast<char*>(&mm), sizeof(int));
binFalt.read(reinterpret_cast<char*>(&yy), sizeof(int));
binFalt.read(reinterpret_cast<char*>(gravedad), sizeof(char)*20);
binFalt.read(reinterpret_cast<char*>(&codigo), sizeof(int));
binFalt.read(reinterpret_cast<char*>(&multa), sizeof(double));
}
}
我错过了什么吗?
答: 暂无答案
评论
bad
seekg
while(1){ binCond.read(...); if(binCond.eof()) break; ... }
while (binCond.read(...)) { ... }