.eof() 无法识别 .seekg(0, ios::beg) 后面的文件末尾 |C++

.eof() doesn't recognize the end of the file after a .seekg(0, ios::beg) | C++

提问人:OzoPolar 提问时间:9/17/2021 更新时间:9/17/2021 访问量:88

问:

我正在使用 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));
    }
}

我错过了什么吗?

C++ C++11 二进制文件 EOF 搜索

评论

1赞 Swift - Friday Pie 9/17/2021
你必须清除状态,否则将不起作用。badseekg
0赞 Remy Lebeau 9/17/2021
顺便说一句,像这样的代码应该重写为while(1){ binCond.read(...); if(binCond.eof()) break; ... }while (binCond.read(...)) { ... }

答: 暂无答案