1

我有一个程序需要读取二进制文本。我通过重定向读取二进制文本:

readData 将是我的 Makefile 生成的可执行文件。

示例:readData < binaryText.txt

我想要做的是读取二进制文本,并将二进制文本文件中的每个字符作为字符存储在 char 数组中。二进制文本由 32 组成这是我这样做的尝试......

unsigned char * buffer;
char d;
cin.seekg(0, ios::end);
int length = cin.tellg();
cin.seekg(0, ios::beg);
buffer = new unsigned char [length];
while(cin.get(d))
{
  cin.read((char*)&buffer, length);
  cout << buffer[(int)d] << endl;
}

但是,我一直在这方面遇到分段错误。可能有人对如何将二进制文本读入 char 数组有任何想法吗?谢谢!

4

4 回答 4

0

最简单的应该是这样的:

std::istringstream iss;
iss << std::cin.rdbuf();

// now use iss.str()

或者,全部在一行中:

std::string data(static_cast<std::istringstream&>(std::istringstream() << std::cin.rdbuf()).str());
于 2012-12-03T01:07:10.300 回答
0

我更像是 C 程序员而不是 C++,但我认为你应该开始你的 while 循环

while(cin.get(&d)){
于 2012-12-03T00:58:11.490 回答
0

像这样的东西应该可以解决问题。您从参数中检索文件名,然后一次性读取整个文件。

const char *filename = argv[0];
vector<char> buffer;

// open the stream
std::ifstream is(filename);

// determine the file length
is.seekg(0, ios_base::end);
std::size_t size = is.tellg();
is.seekg(0, std::ios_base::beg);

// make sure we have enough memory space
buffer.reserve(size);
buffer.resize(size, 0);

// load the data
is.read((char *) &buffer[0], size);

// close the file
is.close();

然后,您只需要遍历vector要读取的字符。

于 2012-12-03T01:10:14.450 回答
0

出现分段错误的原因是您试图使用字符值访问数组变量。

问题:

buffer[(int)d] //d is a ASCII character value, and if the value exceeds the array's range, there comes the segfault.

如果你想要的是一个字符数组,你已经从 cin.read()

解决方案:

cin.read(reinterpret_cast<char*>(buffer), length);

如果要打印,只需使用 printf

printf("%s", buffer);

我使用 reinterpret_cast 是因为它认为转换为有符号字符指针是安全的,因为使用的大多数字符的范围是 0 ~ 127。你应该知道从 128 到 255 的字符值会被错误地转换。

于 2019-01-11T05:40:38.233 回答