我首先从二进制矩阵文件中读取数据并写入新文件,我使用另一个程序将它们读入内存。
写部分
#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字节。
答案 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;
}