Assume you need to read Ctxt
from a stream (file, socket, or whatever) in using HElib
, the general pattern is like this:
Ctxt ctxt(*pubKey);
while (fs >> ctxt)
{
std::cout << ++count << std::endl;
}
But this will trigger following error (If you use one version of HElib
to encrypt Ctxt
, while use another version of HElib
to process Ctxt
, this error may occur too.):
Searching for cc='[' (ascii 91), found c='▒' (ascii -1)
The root cause of this issue is about handling EOF
. To solve this issue, there are 2
methods:
(1)
Ctxt ctxt(*pubKey);
while (!fs.eof())
{
fs >> ctxt >> std::ws;
if (fs.fail())
{
break;
}
}
fs >> ctxt >> std::ws;
will stop when the EOF
is met. Since fs.fail()
won’t return true when eofbit
is set (please refer here), fs.eof()
will becometrue
to terminate while-loop
.
(2) know how many Ctxt
will be read in advance. For example:
Ctxt ctxt(*pubKey);
for (int i = 0; i < 10; i++)
{
fs >> ctxt;
}