Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 读取DRM EDID文件时,大小始终为零_C++_Linux - Fatal编程技术网

C++ 读取DRM EDID文件时,大小始终为零

C++ 读取DRM EDID文件时,大小始终为零,c++,linux,C++,Linux,我试图读取连接到LVDS1的监视器的EDID。我使用ArchLinux和C++/clang。我的问题是:文件大小总是返回0。我不知道这是编程问题还是操作系统特有的问题,其他文件返回正确的文件大小。这是一个特殊的文件吗?symlink目录是否是问题所在 文件:/sys/class/drm/card0-LVDS-1/edid 代码: === 正如MSalters所建议的,我尝试了统计文件大小。也返回0。我假设代码是正确的,所以不知何故不可能访问该文件 我还尝试了符号链接目标路径(/sys/devic

我试图读取连接到LVDS1的监视器的EDID。我使用ArchLinux和C++/clang。我的问题是:文件大小总是返回0。我不知道这是编程问题还是操作系统特有的问题,其他文件返回正确的文件大小。这是一个特殊的文件吗?symlink目录是否是问题所在

文件:
/sys/class/drm/card0-LVDS-1/edid
代码: ===

正如MSalters所建议的,我尝试了统计文件大小。也返回0。我假设代码是正确的,所以不知何故不可能访问该文件

我还尝试了符号链接目标路径(
/sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-LVDS-1/edid),以防出现问题,但仍然是0

代码: ===

我尝试了同一目录中的其他文件(
dpms edid启用的i2c-6模式电源状态子系统uevent
)。它们都返回4096个文件大小,除了
edid
我怀疑
fseek(f,0,2)可能意味着
fseek(f,0,SEEK\u CUR)这显然没有任何作用。您可能需要不可移植的
SEEK\u END
,但是
/sys/
也不可移植。(当然,一定要包括在内)


<>但是考虑到它已经是Linux专用的,为什么不使用?/p>不是很多C++代码,文件的东西都是C代码。@ MsAlter OH,但是它是“C++”:<代码>使用命名空间STD;<代码>你说得对,我只是在谷歌上搜索并从这里复制了代码:我想知道这是否是一个权限问题。如果以root用户身份运行,它的工作方式有什么不同吗?使用类似于
cat
(或
xxd
)的命令,是否会列出同一帐户下的内容?cat可以工作,但它会将二进制文件作为ascii字符返回
#include <fstream>
#include <iostream>

using namespace std;

typedef unsigned char BYTE;

long
get_file_size(FILE *f)
{
    long pos_cursor, pos_end;
    pos_cursor = ftell(f);
    fseek(f, 0, 2);
    pos_end = ftell(f);
    fseek(f, pos_cursor, 0);
    return pos_end;
}

int
main()
{
    const char *filepath = "/sys/class/drm/card0-LVDS-1/edid";
    FILE *file = NULL;

    if((file = fopen(filepath, "rb")) == NULL)
    {
        cout << "file could not be opened" << endl;
        return 1;
    }
    else
        cout << "file opened" << endl;

    long filesize = get_file_size(file);
    cout << "file size: " << filesize << endl;

    fclose(file);

    return 0;
}
file opened
file size: 0
#include <iostream>
#include <sys/stat.h>

using namespace std;

int
main()
{
    const char *filepath = "/sys/class/drm/card0-LVDS-1/edid";
    struct stat results;
    
    if (stat(filepath, &results) == 0)
        cout << results.st_size << endl;
    else
        cout << "error" << endl;

    return 0;
}
0