C++ 转换字符>;十六进制

C++ 转换字符>;十六进制,c++,hex,character,C++,Hex,Character,我试图从磁盘读取一个文件,并输出它的十六进制表示 我使用的代码是: #include <iostream> #include <fstream> using namespace std; int main() { ifstream file ("mestxt", ios::binary); if (file.is_open()) { char* buffer;

我试图从磁盘读取一个文件,并输出它的十六进制表示

我使用的代码是:

#include <iostream>
#include <fstream>
using namespace std;
 
int main() {
        ifstream file ("mestxt", ios::binary);
        if (file.is_open())
        {
                char* buffer;
                buffer= new char[0];
                cout<< "File open"<<endl;
                int count=0;
                while (file.good())
                {
                        file.read(buffer, 1);
                        cout<<hex<<int(*buffer)<<" ";
                        count++;
                        if (count%16==0) cout<<endl;
                }
                file.close();
        }
}
#包括
#包括
使用名称空间std;
int main(){
ifstream文件(“mestxt”,ios::binary);
if(file.is_open())
{
字符*缓冲区;
缓冲区=新字符[0];

cout除了一个易于修复的未定义行为(分配
char[0]
而不是
char[1]
,然后写入
buffer[0]
——超出分配空间一个字节)之外,您的程序还可以。您可以使用标量来代替单个元素数组

#include <iostream>
#include <fstream>
using namespace std;

int main() {
    ifstream file ("mestxt", ios::binary);
    if (file.is_open())
    {
        char buffer;
        cout<< "File open"<<endl;
        int count=0;
        while (file.good())
        {
            file.read(&buffer, 1);
            cout<<hex<<int(buffer)<<" ";
            if ((++count)%16==0) cout<<endl;
        }
        file.close();
    }
}
#包括
#包括
使用名称空间std;
int main(){
ifstream文件(“mestxt”,ios::binary);
if(file.is_open())
{
字符缓冲区;

cout有一个简单的方法可以做到这一点。只要让STL负责设置一个循环。如果您只关心输出十六进制代码,下面是最简单的版本:

#include <iterator>
#include <algorithm>
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    ifstream is("content", ios::binary);
    cout << hex;
    copy(
       istream_iterator<char>(is), 
       istream_iterator<char>(), 
       ostream_iterator<int>(cout, " ")
       );
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
ifstream是(“内容”,ios::二进制);

cout如果您知道您的文件将足够小,可以放入内存,那么将整个文件读入缓冲区,然后对其进行解析会快得多:

std::ifstream file("mestxt", std::ios_base::binary);
file.seekg(0, std::ios_base::end);
std::vector<char> buffer(file.tellg()); 
file.seekg(0, std::ios_base::beg);
file.read(&buffer.front(), buffer.size());

std::cout << std::hex;
std::copy(buffer.cbegin(), buffer.cend(), std::ostream_iterator<int>(std::cout, " "));
std::ifstream文件(“mestxt”,std::ios\u base::binary);
seekg(0,std::ios\u base::end);
std::vector缓冲区(file.tellg());
seekg(0,std::ios\u base::beg);
file.read(&buffer.front(),buffer.size());

std::cout
buffer=new char[0];
看起来非常错误。除了分配一个大小为零的缓冲区(可能根本不需要分配,因为您只需要一个char),我看不出您在抱怨什么。当然,在风格/可靠性方面有一些变化[例如,当你读到最后一个字符时,不打印最后一个字符两次],但我会这样做。使用
char*buffer=new char[0]
(这是错误的)而不是
char buffer;
file.read(&buffer,1)
我的意思是,我75%确定我滥用了这些库,我认为可能有一些方法可以使用,但我试图阅读文档,但没有成功。你的程序可以运行,所以问题应该转移到codereview网站。如果主持人同意,我会提醒主持人注意迁移应该很快就会发生。我不能一次读取一行,因为我不能假设输入文件有行;我可以读取16字节而不是1字节,但是如果!file.good()的话,我会有重复的问题@user1722791您是对的,这是二进制的。您仍然可以提供更大的缓冲区,并在对
file.read
的一次调用中获得多个字符。但是,会有一个嵌套循环。如果您将“file.read()”移动到while[删除
file.good()
]中,您将不会得到重复的最后一个字符(6c在上面列出的输出中出现两次,其中文件本身中只有一个“l”).@dasblinkenlight我想是的;我可以在每个file.read和cout之前清空缓冲区以避免重复问题,但我不认为我可以信任EOF标志,因为它在读取最后16个字节后就已经被设置为打开了。@Mats:Done。这能确保该file.good()始终是真的吗?这将是我一直在搜索的现有库的使用。但是,我仍然存在使用库从输入文件中获取正确字符数的问题,我在这里仍然存在问题。+1非常好地最大限度地使用了标准库!@user1722791:您可以轻松地将上面的更改为count字符数。让我来做。@user1722791:好了。@dasblinkenlight:谢谢:-)虽然这对我的目标是正确的(基本上是romhacking),但我不能总是确定。@user1722791即使如此,你也应该循环较大的块(你知道的大小会适合内存)而不是一次读取一个字符。在现实世界中,文件IO会一次命中一个字符:)
std::ifstream file("mestxt", std::ios_base::binary);
file.seekg(0, std::ios_base::end);
std::vector<char> buffer(file.tellg()); 
file.seekg(0, std::ios_base::beg);
file.read(&buffer.front(), buffer.size());

std::cout << std::hex;
std::copy(buffer.cbegin(), buffer.cend(), std::ostream_iterator<int>(std::cout, " "));