写入二进制文件时,ofstream :: write写入的字节数超出应有的数量

时间:2015-12-25 03:46:53

标签: c++ fstream ifstream ofstream

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

写部分

#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字节。

2 个答案:

答案 0 :(得分:1)

这是第二部分中的读取循环。假设文件为空;第一次通过fin仍然是true,因为您已成功打开文件但尚未尝试从中读取,并且您将count增加到{{1}它应该留在1

您需要重新排列循环,这样只有在成功读取后才会增加计数。

答案 1 :(得分:1)

对于阅读部分:

#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;
}