C++ C++;Linux/dev/*fwrite/fread失败,但写入/读取成功
我正在写linux上硬件设备的/dev接口。/dev接口以linux文件的形式呈现,只需读写文件即可与设备通信。我正在使用STD C++文件包装器STD::FrWORD和STD::FADAD,因为我需要访问IOCTL调用的文件描述符的文件,而不是用首选的STD::OFFROW,但我离题。p> 问题很简单,当使用std:::*调用时,先写后读失败。这似乎是fseek的问题,但我不确定。使用如下所示的fseek代码,连续写入将返回成功,但不会写入数据,如果没有fseek代码,std::fread调用将返回错误值。奇怪的是,linux文件函数(写和读)工作得很好,没有任何fseek混乱或任何东西。我的问题是为什么 Linux功能版本(工作正常):C++ C++;Linux/dev/*fwrite/fread失败,但写入/读取成功,c++,linux,c++11,embedded-linux,hardware-programming,C++,Linux,C++11,Embedded Linux,Hardware Programming,我正在写linux上硬件设备的/dev接口。/dev接口以linux文件的形式呈现,只需读写文件即可与设备通信。我正在使用STD C++文件包装器STD::FrWORD和STD::FADAD,因为我需要访问IOCTL调用的文件描述符的文件,而不是用首选的STD::OFFROW,但我离题。p> 问题很简单,当使用std:::*调用时,先写后读失败。这似乎是fseek的问题,但我不确定。使用如下所示的fseek代码,连续写入将返回成功,但不会写入数据,如果没有fseek代码,std::fread调用
bool写入(const std::vector&data)
{
if(write(GetFileDescriptor(),&data[0],sizeof(T)*data.size())==
sizeof(T)*data.size())
返回true;
返回false;
}
标准::矢量读取(int CountOfT)
{
std::向量buf(CountOfT);
如果(读取(GetFileDescriptor(),&buf[0],sizeof(T)*CountOfT)!=
sizeof(T)*CountOfT)
抛出“stuff”;//我实际上使用std::optional
返回buf;
}
标准版本(失败)
bool写入(const std::vector&data)
{
if(std::fwrite(data.data(),sizeof(T),data.size(),m_fd.get())<
data.size())
返回false;
返回true;
}
标准::矢量读取(int CountOfT)
{
long fileoffset=std::ftell(m_fd.get());//获取当前偏移量
std::fseek(m_fd.get(),0,SEEK_SET);//在文件开始处放置偏移量
std::向量buf(CountOfT);
if(std::fread(&buf[0],sizeof(T),buf.size(),m_fd.get())
Bacausefwrite
将数据缓冲在内存中?缓冲后的数据不会仍然以相同的顺序命中文件吗?fread
就在fwrite
之后,没有干预fseek
或fflush
的情况下,表现出未定义的行为fwrite
紧跟在fread
之后,没有干预fseek
(fflush
在这里没有帮助)显示未定义的行为。尝试将fseek
调用替换为fseek(…,0,SEEK\u CUR)
——这实际上不会移动文件位置,但会告诉运行时刷新缓冲区并重置其保持的任何状态。
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;
}
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;
}