C ++ Linux / dev / * fwrite / fread失败但写/读成功

时间:2017-05-25 00:06:27

标签: c++ linux c++11 embedded-linux hardware-programming

我正在写入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;
}

0 个答案:

没有答案