Прямо сейчас я использую istream для чтения данных. У меня есть и текст, который я хотел бы читать как строки и числа, и хеши, которые считываются в массивы символов. Так как хэши эффективно случайны, я поражаю змеи, когда я пытаюсь прочитать его обратно и попал в EOF (который является частью хэша). Есть ли способ сделать это, не прибегая к страху. Кроме того, есть ли использовать как istream, так и fread, некоторые из них мне не нужны, чтобы разобрать целые числа и строки вручную. Наконец, что лучший способ использовать fgets для получения строки неизвестной длины.Могу ли я читать двоичные данные с istream в C++?
Спасибо, Eric
EDIT: Вот код:
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> Got байт: 4 4
1> Байт: -1 4 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 я: 12 hashLength: 16
1> Получили первые байты: 32
1> Гот байты: 14 14
1> Ошибка! 1 0
1> Got байт: -65 191
1> Ошибка! 1 0
1> Got байт: -107 149
1> Ошибка!1 0
1> Got байт: -44 212
1> Ошибка! 1 0
1> Got байт: -60 196
1> Ошибка! 1 0
1> Got байт: -51 205
1> Ошибка! 1 0
1> Got байт: -51 205
1> Ошибка! 1 0
Образец ваших данных и код, который вы используете для его чтения, будут иметь * длинный * путь в получении ответов на то, что происходит не так. Что касается разбора целых чисел и строк вручную, отформатированные экстракторы с 'istream's - это пижамы для кошек. – WhozCraig
EOF не может быть частью хэша, поскольку EOF - это концепция, которая не может быть встроена в файл. Однако вы читаете данные, это неправильно. –
Да потоки могут читать двоичные данные.Потоки имеют функции для синтаксического анализа целых чисел и строк различной длины. Не используйте fgets, fread или другие c-функции на C++. –