我正在写入 linux 上硬件设备的 /dev 接口。/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;
}