【问题标题】:File not read correctly in binary mode C++文件在二进制模式 C++ 中无法正确读取
【发布时间】:2020-02-11 15:44:43
【问题描述】:

我有一个包含以下数据的二进制文件,

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

文件中没有其他数据,我用二进制编辑器检查过。 我有什么问题?

【问题讨论】:

  • 当您使用调试器运行程序时,您看到了什么?这就是调试器的用途。如果您不知道如何使用调试器,这是一个学习如何使用它来一次运行您的程序、监控所有变量及其值的变化以及分析程序的逻辑执行流程的好机会。知道如何使用调试器是每个 C++ 开发人员必备的技能,没有例外。在调试器的帮助下,您应该能够快速找到此程序以及您编写的所有未来程序中的所有错误,而无需向任何人寻求帮助。
  • 你期望输出是什么?应该和输入一样吗?
  • Sam Varshavchik,不,我很确定我没有任何逻辑错误,只是文件输入有问题,我的程序在从带有 ascii 字符的文件中读取时给出了正确的值,但它不能当文件具有任意二进制值时正确读取。

标签: c++ binary fstream


【解决方案1】:

10110100 是 180。

在大多数平台上,char 是一个带符号的 8 位数字,范围为 -128127

当你读入10110100a被设置为-76

76 是与您的输出匹配的二进制 01001100

char 更改为unsigned char 应该可以解决您的问题:

unsigned char a;
while(input.read(reinterpret_cast<char*>(&a), 1))

【讨论】:

  • 抱歉,没用,我收到一个错误,error: invalid static_cast from type 'unsigned char*' to type 'char*'
  • 试试reinterpret_cast
  • 在哪里?如果您的意思是while(),那么我做到了。我复制粘贴了你的行并替换了char a; while(input.get(a))
  • 不,出现了 2 个错误,error: cannot bind rvalue '(std::basic_istream&lt;char&gt;::char_type)((long long int)(&amp; a))' to 'std::basic_istream&lt;char&gt;::char_type&amp; {aka char&amp;}'error: invalid conversion from 'char*' to 'std::basic_istream&lt;char&gt;::char_type {aka char}' [-fpermissive]
  • 试试新版本
猜你喜欢
  • 1970-01-01
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
  • 2016-09-30
  • 2010-12-05
  • 2019-09-24
相关资源
最近更新 更多