0

我正在尝试从包含二进制数的文件中读取并将它们更改为整数并将它们存储在数组中。问题是当我尝试查看文件时,数字被伪装成随机的无意义字符。这是文件的样子,

\æFQÆ3QËDO':^ÞC2-%<ýÁ-ã+)=ó> Mù ¯M^££ÚUWæÑB5q'Ô¡r2ø7grh-6a¦4bï ¡!$imÁ|BW@0U³z½]Nµ)?J¢gÕ.W- jumÖ8/ s&²-§niJC~·Bº3¸Rãk+x&ãkÎp«éÌEÓ-Üy ùo¬¦+®<%jNN#L

我写了一个函数来尝试阅读它,但它在这里不起作用是这个函数:

void readf2()
{
    std::ifstream inFile("f2");
    std::string line;
    int num;
    while(!inFile.eof()){
     std::getline(inFile,line);
     num = atoi(line.c_str());
     cout<<num;
     cout<<"\n";
    }
}

我不知道如何正确读取这个文件。我应该怎么做。不atoi正确还是我应该尝试类似的东西strtoi?提前谢谢大家。

4

2 回答 2

5

二进制数据不是字符。您不能将它们作为字符读取,也不能使用字符串输入(如std::getline)从文件中读取。

首先,您应该以二进制模式打开文件:

std::ifstream inFile("f2", std::ios_base::binary);

然后使用未格式化的非文本函数读取,例如std::istream::read

std::int32_t buffer[512];
while (inFile.read(reinterpret_cast<char*>(buffer), sizeof(buffer)) { ... }

如果读取操作成功,您将拥有一个最多包含512 个 32 位整数的数组(用于std::istream::gcount找出读取了多少字节)。

还要注意循环阅读的惯用方式。例如,当您这样做时,while (!inFile.eof())您可能会尝试一次对多次读取,因为直到读取操作失败后才会设置 EOF 标志。


如果您不知道文件中数据的格式,则很难说上述读数是否正确。数据可能是包含 8 到 64 位值、浮点值甚至实际文本字符的混合结构。

于 2013-10-14T04:29:07.273 回答
1

您需要将文件作为二进制文件打开。您将其作为文本文件打开。看这里:

http://www.cplusplus.com/doc/tutorial/files/

查看 ios::binary 部分。

于 2013-10-14T04:30:10.260 回答