我正在写入linux上硬件设备的/ dev接口。 / dev接口显示为linux文件,与您只需读取和写入文件的设备进行通信。我正在使用std c ++文件包装器std :: fwrite和std :: fread,因为我需要访问ioctl调用的文件底层文件描述符,这不会被首选的std :: ofstream暴露但我离题了。
问题很简单,当使用std :: *调用时,写入后读取失败。这似乎与fseek有关,但我不确定。使用如下所示的fseek代码,连续写入返回就好像它们是成功但没有写入数据,没有fseek代码,std :: fread调用返回错误值。奇怪的是,linux文件的功能(写入和读取)工作得很好,没有任何混乱或任何东西。我的问题是为什么!?
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;
}