写入二进制文件时,ofstream::write 写入的字节多于应有的字节数

When writing into a binary file, ofstream::write writes more bytes than it should

我首先从一个二进制矩阵文件中读取数据并写入一个新文件,然后我使用另一个程序将它们读入内存。

写部分

#define BIT_NUM 8
using namespace std;
int main(int argc, char **argv) {
    if (argc >= 2) {
        char* filename = argv[1];
        ifstream fin(filename);
        ofstream fout("../../hashcode.dat", ios_base::trunc | ios_base::out | ios_base::binary);
        char c;
        bitset<BIT_NUM> temp;
        int index = 0;
        int count = 0;
        while (fin.get(c)) {
            if (c != '\n' && c != ',') {
                temp.set(BIT_NUM - index - 1, c - '0');
                index++;
            }
            if (index == BIT_NUM) {
                unsigned char byte = static_cast<unsigned char>(temp.to_ulong());
                fout.put(byte);
                count++;
                index = 0;
            }
        }
        cout << count << "\n";
        fin.close();
        fout.close();
    }
    return 0;
}

输出:14610144

阅读部分

#define BIT_NUM 256
#define BYTE_NUM 32
using namespace std;
int main(int argc, char **argv) {
    ifstream fin("../../hashcode.dat", ios_base::binary);
    char buff[1];
    int count = 0;
    while(fin) {
        fin.read(buff, 1);
        count++;
        /**/
    }
    cout << count << "\n";
    return 0;
}

输出:14610145

我尝试比较结果,发现多余的字节在尾部,与最后一个字节相同。我想知道为什么 I/O 进程会产生这样一个额外的字节。当我查看输出文件 hashcode.dat 的 属性 时,它的大小恰好是 14610144 字节。

这是第二部分的读取循环。假设文件是​​空的;第一次通过 fin 仍然是 true 因为你已经成功打开文件但还没有尝试读取它,你会增加 count1 当它应该停留在 0.

您需要重新安排循环,使其仅在成功读取后增加计数。

阅读部分:

#define BIT_NUM 256
#define BYTE_NUM 32
using namespace std;
int main(int argc, char **argv) {
    ifstream fin("../../hashcode.dat", ios_base::binary);
    char buff[1];
    int count = 0;
    while(fin.read(buff, 1)) {
        count++;
        /**/
    }
    cout << count << "\n";
    return 0;
}