在二进制模式下 C++ 无法正确读取文件
File not read correctly in binary mode C++
我有一个包含以下数据的二进制文件,
10110100
11111001
01110001
我用这段代码来阅读它,
#include<bits/stdc++.h>
using namespace std;
int main()
{
string in;
cin>>in;
ifstream input(in.c_str(),ios::in | ios::binary);
if(!input.is_open())
{
cout<<"oops!!"<<endl;
return 0;
}
cout<<"OK!!"<<endl;
char a;
while(input.get(a))
{
string s="";
int b=a,c=0;
while(b!=0)
{
c++;
s+=(b%2?'1':'0');
b/=2;
}
s+=string(8-c,'0');
for(int i=s.length()-1;i>=0;i--)
cout<<s[i];
cout<<endl;
}
cout<<endl<<"DONE!!"<<endl;
}
基本上使用 get()
函数从文件中读取一个字符,1 个字节,并将其输出为二进制表示形式。
我也试过 read()
但它似乎没有用。
如果有帮助,我会得到以下输出,
01001100
00000111
01110001
文件中没有其他数据,我用二进制编辑器检查过。
我有什么问题?
10110100
是 180.
在大多数平台上,char
是一个带符号的 8 位数字,范围为 -128
到 127
。
当您读入 10110100
时 a
设置为 -76
。
76
是二进制的 01001100
,与您的输出匹配。
将 char
更改为 unsigned char
应该可以解决您的问题:
unsigned char a;
while(input.read(reinterpret_cast<char*>(&a), 1))
我有一个包含以下数据的二进制文件,
10110100
11111001
01110001
我用这段代码来阅读它,
#include<bits/stdc++.h>
using namespace std;
int main()
{
string in;
cin>>in;
ifstream input(in.c_str(),ios::in | ios::binary);
if(!input.is_open())
{
cout<<"oops!!"<<endl;
return 0;
}
cout<<"OK!!"<<endl;
char a;
while(input.get(a))
{
string s="";
int b=a,c=0;
while(b!=0)
{
c++;
s+=(b%2?'1':'0');
b/=2;
}
s+=string(8-c,'0');
for(int i=s.length()-1;i>=0;i--)
cout<<s[i];
cout<<endl;
}
cout<<endl<<"DONE!!"<<endl;
}
基本上使用 get()
函数从文件中读取一个字符,1 个字节,并将其输出为二进制表示形式。
我也试过 read()
但它似乎没有用。
如果有帮助,我会得到以下输出,
01001100
00000111
01110001
文件中没有其他数据,我用二进制编辑器检查过。 我有什么问题?
10110100
是 180.
在大多数平台上,char
是一个带符号的 8 位数字,范围为 -128
到 127
。
当您读入 10110100
时 a
设置为 -76
。
76
是二进制的 01001100
,与您的输出匹配。
将 char
更改为 unsigned char
应该可以解决您的问题:
unsigned char a;
while(input.read(reinterpret_cast<char*>(&a), 1))