如何从popen中获取结果?

问题描述 投票:0回答:1

我想为程序创建一个小补丁。我对C不太了解。

当我的函数

get_streamlink
返回
buffer
时,下一个代码无法通过
m3u8
url 获取视频。当函数返回静态url时,视频显示成功。在这两种情况下,url 和下一个代码是相同的。怎么了?

UPD:感谢您的评论。来自

\n
fgets
存在问题。

static char *get_streamlink(const char *url) {
    char *template = "streamlink %s best --stream-url";
    char *buffer = (char *)malloc(5060);
    FILE *pPipe;

    struct dstr command = {0};
    dstr_catf(&command, template, url);
    pPipe = _popen(command.array, "rt");
    dstr_free(&command);

    while (fgets(buffer, 5060, pPipe)) {
        puts(buffer);
    }

    int endOfFileVal = feof(pPipe);
    int closeReturnVal = _pclose(pPipe);

    // failed
    return buffer;

    // OK
    // return "https://video-weaver.arn03.hls.ttvnw.net/v1/playlist/CvAEXGd8OH7.....m3u8";
}

static void add_file(struct vlc_source *c, media_file_array_t *new_files,
             const char *path, int network_caching, int track_index,
             int subtitle_index, bool subtitle_enable,
             const char *hw_value, bool skip_b_frames)
{
    struct media_file_data data;
    struct dstr new_path = {0};
    libvlc_media_t *new_media;
    bool is_url = path && strstr(path, "://") != NULL;

    dstr_copy(&new_path, path);
#ifdef _WIN32
    if (!is_url)
        dstr_replace(&new_path, "/", "\\");
#endif
    dstr_copy(&new_path, get_streamlink(new_path.array));
    path = new_path.array;
    new_media = get_media(&c->files, path);

    //...
}

enter image description here

c++ c malloc
1个回答
1
投票

您需要删除尾随的

\n
/
\r\n

由于您使用的是非标准函数

_popen
,您还可以使用 MSVC 中的另一个非标准扩展:采用
basic_ifstream
FILE*
构造函数。这样您就可以在输入流上使用
std::getline

#include <cstdio>
#include <fstream>
#include <iostream>
#include <string>

std::ifstream Popen(const char* command) {
    auto fp = _popen(command, "rt");
    return std::ifstream(fp);         // construct the ifstream using a FILE*
}

int main() {
    auto is = Popen("dir");
    std::string line;
    while (std::getline(is, line)) {
        std::cout << line << '\n';
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.