C++ 获取任何文件的字符串表示形式,C++;

C++ 获取任何文件的字符串表示形式,C++;,c++,fstream,C++,Fstream,我试图以某种方式获取任何文件的表示形式(我的意思是.mp3,.mp4,.jpg,.txt,…),使我能够像处理字符串一样处理它,将该表示形式保存在字符数组或字符串本身上 我不知道如何提取这些信息。。。可能是十六进制代码,在字节级,甚至在位级。我正在使用fstream类寻找一些东西,但不一定 提前感谢。使用字符串存储二进制数据是错误的。考虑 STD::向量< /代码>或类似的。然后你就可以写了 std::ifstream is("myfile.mp3", std::ifstream::binary

我试图以某种方式获取任何文件的表示形式(我的意思是
.mp3
.mp4
.jpg
.txt
,…),使我能够像处理字符串一样处理它,将该表示形式保存在字符数组或字符串本身上

我不知道如何提取这些信息。。。可能是十六进制代码,在字节级,甚至在位级。我正在使用
fstream
类寻找一些东西,但不一定


提前感谢。

使用字符串存储二进制数据是错误的。考虑<代码> STD::向量< /代码>或类似的。然后你就可以写了

std::ifstream is("myfile.mp3", std::ifstream::binary);

// Find the length of the file
is.seekg(0, is.end);
std::streampos length = is.tellg();
is.seekg(0, is.beg);

// Create a vector to read it into
std::vector<unsigned char> bytes(length);

// Actually read data
is.read((char *)&bytes[0], length);

// Close the file explicitly, since we're finished with it
is.close();
std::ifstream是(“myfile.mp3”,std::ifstream::binary);
//查找文件的长度
is.seekg(0,is.end);
std::streampos length=is.tellg();
is.seekg(0,is.beg);
//创建一个向量以将其读入
std::向量字节(长度);
//实际读取数据
is.read((字符*)&字节[0],长度);
//显式关闭文件,因为我们已经完成了它
is.close();

数据将以
字节结束
。这里请注意,我们依赖于
std::vector
的一个属性,即它分配一个连续的内存块。(在C++11中,您可能更喜欢编写
bytes.data()
,而不是
&bytes[0]

注意。您能澄清一下您想要实现什么吗?举个例子可能会有所帮助。谢谢。实际上,我还没有任何代码。我试图简单地理解文件是如何在低级别上存储的,但是我们可以从编程语言的角度来处理它。然后我只想对一些文件的这些数据进行一些操作,比如长度测量等等。实际上,任何文件访问方案都允许您以字节数组的形式读取文件(在C中,如果您有足够的RAM,当然可以是
char[]
)。但是,如果您试图以字符形式读取任意文件,您将不可避免地损坏该文件。非常感谢您的回复。实际上,我必须在read()函数上对(char*)进行转换,因为这是它需要的参数。除此之外,当我试图打印时,有很多奇怪的字符,所以我想知道结果是否正确。例如,如果我们再次获得所有这些字符并创建一个新文件,我们是否将获得正确的音频文件?@user2018219不将它们视为字符。它们是字节(二进制值介于0和255之间)。C/C++恰好调用了字节类型
char
,而不是
byte
。如果您有兼容C99的系统,您可以
#包括
并使用
uint8\u t
(尽管这可能只是
typedef
无符号字符
)。不管怎样,只要把它们当作数字而不是字符,你就会没事的。是的,将它们放入一个新文件将为您提供一个正确的音频文件。@user2018219关于向量中的数字应该是什么,以及它们的含义,您需要参考,所以,使用字符(或强制转换)而不是无符号字符是否正确?read()函数需要一个char*作为第一个参数。对不起,我不清楚。关于字符问题,我试图考虑字符而不是字节,因为我的目的是插入以前无法在已读文档中找到的新字符。我想这是不可能的。。。你知道有什么办法吗?再次感谢您,真的。@user2018219根据我的经验,使用
char
(根据编译器的不同可以是有符号的或无符号的)或
signed char
来表示二进制数据通常会导致错误。我强烈建议改为
无符号字符
(或
uint8\u t
)。至于修改您加载的文件,您可以使用其中的任何一个进行修改,但您必须遵守您加载的文件类型的规范,否则结果将无效。