Я пишу в / dev интерфейс аппаратного устройства на Linux. Интерфейс / dev представлен в виде файла linux, чтобы общаться с устройством, которое вы просто читаете, и пишите файл. Я использую std c ++ упаковщики файлов std :: fwrite и std :: fread, потому что мне нужен доступ к файловому дескриптору файла для вызовов ioctl, который не предоставляется предпочтительным std :: ofstream, но я отступаю.
Проблема проста: запись с последующим чтением завершается неудачно при использовании вызовов std :: *. Это похоже на проблему с fseek, но я не уверен. С кодом fseek, как показано ниже, последовательные записи возвращаются так, как будто они успешны, но данные не записываются, без кода fseek вызов std :: fread возвращает значение ошибки. Любопытно, что файловые функции linux (запись и чтение) работают отлично, без каких-либо проблем с fseek или чего-либо еще. У меня вопрос ПОЧЕМУ?
Версия функции Linux (работает отлично):
bool Write(const std::vector<T> &data)
{
if(write(GetFileDescriptor(),&data[0],sizeof(T) * data.size()) ==
sizeof(T) * data.size())
return true;
return false;
}
std::vector<T> Read(int CountOfT)
{
std::vector<T> buf(CountOfT);
if(read(GetFileDescriptor(), &buf[0], sizeof(T) * CountOfT) !=
sizeof(T) * CountOfT)
throw "stuff"; //i actually use std::optional
return buf;
}
Версия STD (не работает)
bool Write(const std::vector<T> &data)
{
if(std::fwrite(data.data(), sizeof(T), data.size(), m_fd.get()) <
data.size())
return false;
return true;
}
std::vector<T> Read(int CountOfT)
{
long fileoffset = std::ftell(m_fd.get()); //get current offset
std::fseek(m_fd.get(),0,SEEK_SET); //place offset at file start
std::vector<T> buf(CountOfT);
if(std::fread(&buf[0],sizeof(T),buf.size(),m_fd.get()) < CountOfT)
throw "stuff";
std::fseek(m_fd.get(),fileoffset,SEEK_SET); //reset to where it was
return buf;
}
Задача ещё не решена.
Других решений пока нет …