C++ C++;Linux/dev/*fwrite/fread失败,但写入/读取成功

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调用

我正在写linux上硬件设备的/dev接口。/dev接口以linux文件的形式呈现,只需读写文件即可与设备通信。我正在使用STD C++文件包装器STD::FrWORD和STD::FADAD,因为我需要访问IOCTL调用的文件描述符的文件,而不是用首选的STD::OFFROW,但我离题。p> 问题很简单,当使用std:::*调用时,先写后读失败。这似乎是fseek的问题,但我不确定。使用如下所示的fseek代码,连续写入将返回成功,但不会写入数据,如果没有fseek代码,std::fread调用将返回错误值。奇怪的是,linux文件函数(写和读)工作得很好,没有任何fseek混乱或任何东西。我的问题是为什么

Linux功能版本(工作正常):

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())
Bacause
fwrite
将数据缓冲在内存中?缓冲后的数据不会仍然以相同的顺序命中文件吗?
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;
}