gpt4 book ai didi

c++ - 我可以用c++中的istream读取二进制数据吗?

转载 作者:行者123 更新时间:2023-12-01 19:24:55 26 4
gpt4 key购买 nike

现在我正在使用 istream 读取数据。我有想要以字符串和数字形式读入的文本,以及读入字符数组的哈希值。由于哈希值实际上是随机的,因此当我尝试读回它并命中 EOF(这是哈希值的一部分)时,我遇到了障碍。有没有一种方法可以在不诉诸恐惧的情况下实现这一目标。另外,是否可以同时使用 istream 和 fread 一些我不必手动解析整数和字符串。最后,使用 fgets 获取未知长度的字符串的最佳方法是什么。

谢谢,埃里克

编辑:这是代码:

string dummy;
ifstream in(fileName);
for(int i=0; i<numVals; i++)
{
int hashLen;
in>>hashLen;
char cc;
in.get(cc);//Get the space in between
cout<<"Got first byte: "<<(int)cc<<endl;

char * hashChars = new char[hashLen];
in.read(hashChars, hashLen);
for(int j =0; j <hashLen; j++)
{
char c = hashChars[j];
unsigned char cc = reinterpret_cast<unsigned char&>(c);
cout<<"Got byte: "<<(int)c<<(int)cc<<endl;
if(in.fail())
{
cout<<"Failed! "<<in.eof()<<" "<<in.bad()<<endl;
}
}

delete hashChars;

getline(in,dummy);//get a dummy line
cout<<"Dummy: "<<dummy<<" numvals: "<<numVals<<" i: "<<i<<" hashLength: "<<hashLen<<endl;
}

我的输出如下:

1>得到第一个字节:32

1>获得字节:4 4

1>获取字节:-14 242

1>获取字节:108 108

1>获取字节:87 87

1>获取字节:113 113

1>获取字节:-116 140

1>获取字节:-106 150

1>获取字节:-35 221

1>获取字节:0 0

1>获取字节:-91 165

1>获取字节:39 39

1>获取字节:111 111

1>得到字节:7 7

1>获取字节:126 126

1>获取字节:16 16

1>获取字节:-42 214

1>虚拟:numvals:35 i:12 hashLength:16

1>得到第一个字节:32

1>获取字节:14 14

1>失败! 1 0

1>获取字节:-65 191

1>失败! 1 0

1>获取字节:-107 149

1>失败! 1 0

1>获取字节:-44 212

1>失败! 1 0

1>获取字节:-60 196

1>失败! 1 0

1>获取字节:-51 205

1>失败! 1 0

1>获取字节:-51 205

1>失败! 1 0

最佳答案

读取二进制数据时,您通常希望打开 std::ifstream带有标志std::ios_base::binary 。由此产生的差异相当小,但通常很重要。

您的代码中有一些奇怪的地方您可能需要修复:

  • 始终需要在阅读后检查操作是否成功,例如使用if (in.read(hashChars, hashLen)) { ... }
  • 无需使用reinterpret_cast<...>()它总是具有实现定义的语义。您应该使用static_cast<unsigned char>(c)相反。
  • 您分配了一个字符数组,但使用 delete p 释放它。您需要使用delete[] p反而。使用delete p导致未定义的行为。确实没有必要使用 newdelete不过,无论如何,如 std::vector<char> hashChars(hashLen)进行自动内存管理。

上面的请求中嵌入了一些[残缺的]问题(因此问题/答案是对所问内容的猜测):

  • 你能混合std::istream::read()fread()在同一个流上(我想这就是问题):不会立即,除非流恰好是 std::cin其读取来源与 stdin 相同。如果您想同时使用 std::istream::read()fread()在同一个文件上,您需要包装 FILE*通过合适的std::streambuf并初始化 std::istream与相应的对象。
  • 如何使用 fgets() 读取任意大小的行?你不能。缓冲区到fgets()在尝试填充它之前被分配,并且总是可以在到达换行符之前被填充。您可以使用std::getline()然而,读取任意长行。如果您只是想跳过该行,可以使用 in.ignore(std::numeric_limits<std::streamsize>::max(), '\n')当使用std::istream时。副手不知道FILE*有没有类似的操作.

关于c++ - 我可以用c++中的istream读取二进制数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18283616/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com