[英]Reading binary file of int to string c++
我在读取二进制文件时遇到问题。 当我读取包含字符串的二进制文件时,它读起来很完美。 但是当我尝试读取看起来像这样的文件时:
1830 3030 3030 3131 3031 3130 3000 0000
0000 0000 0000 0000 1830 3030 3030 3131
3030 3030 3100 0000 0000 0000 0000 0000
1830 3030 3030 3131 3030 3131 3000 0000
0000 0000 0000 0000 1830 3030 3030 3131
3031 3030 3000 0000 0000 0000 0000 0000
1830 3030 3030 3131 3031 3131 3100 0000
0000 0000 0000 0000 1830 3030 3030 3131
3130 3130 3100 0000 0000 0000 0000 0000 ... and so on
它只读取其中的一部分。 这是我用于读取二进制文件并将其转换为字符串的代码。
string toString (const char *c, int size);
int main(int argc, char* argv[])
{
streampos size;
char * memblock;
ifstream file (argv[1], ios::in|ios::binary|ios::ate);
size = file.tellg();
memblock = new char[size];
file.seekg (0, ios::beg);
file.read (memblock, size);
file.close();
string input = toString(memblock,size);
cout << input << endl; //this prints just portion of it 000001101100
return 0;
}
string toString (const char *c, int size)
{
string s;
if (c[size-1] == '\0')
{
s.append(c);
}
else
{
for(int i = 0; i < size; i++)
{
s.append(1,c[i]);
}
}
return s;
}
但是,当我尝试读取0和1的txt文件时,它的读取效果很好。 我对C ++很陌生,但我不确定为什么会这样。
您的问题是您正在使用cout
。 这旨在打印人类可读的字符串,而不是二进制字符串。 因此,您标记的行:
cout << input << endl; //this prints just portion of it 000001101100
将只打印它的一部分。
您提供的二进制数据是:
1830 3030 3030 3131 3031 3130 3000 0000
这是数据第一行的ASCII:
<CAN> "000001101100" <NUL> <NUL> <NUL>
第一个<CAN>
为0x18
<NUL>
的值为0
这就是cout
停止的地方:它将打印人类可读的ASCII值,直到遇到0
您的数据已满。
您需要打印字符的十六进制值-这是一个涉及更多的过程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.