注册 登录
编程论坛 C++教室

二进制文件数据的读取和写入出错

ehszt 发布于 2023-10-05 12:45, 568 次点击
/***********************************
二进制文件数据的读取和写入
***********************************/
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    int age,height,readAge,readHeight;
    cout<<"please input age and height:";
    cin>>age>>height;

    ofstream outBinaryFile("binary.abc",ios::binary|ios::app);
    if(outBinaryFile.fail())
    {
        cout<<"open file failed."<<endl;
        exit(0);
    }
    outBinaryFile.write(reinterpret_cast<char *>(&age),sizeof(age));
    outBinaryFile.write(reinterpret_cast<char *>(&height),sizeof(height));
    outBinaryFile.close();

    ifstream inBinaryFile("binary.abc",ios::binary);
    if(inBinaryFile.fail())
    {
        cout<<"open file failed."<<endl;
        exit(0);
    }
    inBinaryFile.seekg(-sizeof(int)*2,ios::end); //每次读文件,从文件末尾前移两个int字节,不知道对不对,请各位指点
    inBinaryFile.read(reinterpret_cast<char *>(&readAge),sizeof(readAge));
    inBinaryFile.read(reinterpret_cast<char *>(&readHeight),sizeof(readHeight));
    inBinaryFile.close();

    cout<<"age from file:"<<readAge<<endl
       <<"height from file:"<<readHeight<<endl;

    return 0;
}
输出的数值不对
6 回复
#2
rjsp2023-10-05 14:47
输出的数值不对
你得说说怎么个不对,即“不对”的现象是什么?

去除无关代码
程序代码:
#include <iostream>
#include <fstream>
using namespace std;

int main( void )
{
    {
        std::ofstream file( "binary.abc", ios::binary|ios::app );
        if( file )
        {
            int a=1, b=2;
            file.write( reinterpret_cast<char*>(&a), sizeof(a) );
            file.write( reinterpret_cast<char*>(&b), sizeof(b) );
        }
    }

    {
        std::ifstream file( "binary.abc", ios::binary|ios::app );
        if( file )
        {
            int a, b;
            std::ifstream::traits_type::off_type off = sizeof(a) + sizeof(b);
            file.seekg( -off,ios::end );
            file.read( reinterpret_cast<char*>(&a), sizeof(a) );
            file.read( reinterpret_cast<char*>(&b), sizeof(b) );
            cout << a << '\n' << b << endl;
        }
    }
}
你编译运行一下,把你认为不对的输出贴出来。
#3
ehszt2023-10-05 14:51
只有本站会员才能查看附件,请 登录


#4
ehszt2023-10-05 14:52
应该输出19 110才对
#5
ehszt2023-10-05 15:02
std::ifstream::traits_type::off_type 这个是什么意思?
直接这么写有什么错误?    inBinaryFile.seekg(-sizeof(int)*2,ios::end);

[此贴子已经被作者于2023-10-5 15:06编辑过]

#6
ehszt2023-10-05 15:14
只有本站会员才能查看附件,请 登录

发现这样转一下结果就是对的,直接用右边的去替换a就不对!
#7
rjsp2023-10-05 16:11
以 uint8_t 转 int16_t 为例

uint8_t a = -1; // a的值为 255
int16_t b = a; // b的值为 255

1