写入二进制文件时,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
因为你已经成功打开文件但还没有尝试读取它,你会增加 count
到 1
当它应该停留在 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;
}
我首先从一个二进制矩阵文件中读取数据并写入一个新文件,然后我使用另一个程序将它们读入内存。
写部分
#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
因为你已经成功打开文件但还没有尝试读取它,你会增加 count
到 1
当它应该停留在 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;
}