You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中直接读取在线Raw Pastebin文件内容(无额外依赖)

直接在C++中读取在线Raw Pastebin内容(无额外依赖)

没问题!想要在C里直接读取在线Raw Pastebin的内容,又不想依赖第三方库,完全可以借助系统自带的网络API来实现——毕竟C标准库本身没提供网络操作的模块。下面我分Windows和Linux两个平台给你写针对性的实现,都是只依赖系统库的方案:

Windows 平台(用WinINet API)

WinINet是Windows系统自带的网络工具库,不用额外安装任何东西,只要编译时链接wininet.lib就行。因为你说目标文件只有一行文本,咱们可以读到换行就停,省点资源:

#include <windows.h>
#include <wininet.h>
#include <iostream>
#include <string>

#pragma comment(lib, "wininet.lib")

int main() {
    // 初始化WinINet环境
    HINTERNET hInternet = InternetOpenA("RawPastebinReader", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    if (!hInternet) {
        std::cerr << "初始化网络环境失败,错误码:" << GetLastError() << std::endl;
        return 1;
    }

    // 打开目标Raw Pastebin地址
    HINTERNET hUrl = InternetOpenUrlA(hInternet, "pastebin.com/raw/k1XLUS00", NULL, 0, INTERNET_FLAG_RELOAD, 0);
    if (!hUrl) {
        std::cerr << "打开URL失败,错误码:" << GetLastError() << std::endl;
        InternetCloseHandle(hInternet);
        return 1;
    }

    // 逐字符读取内容,直到换行或结束
    char buffer[2];
    std::string content;
    DWORD bytesRead;
    while (InternetReadFile(hUrl, buffer, 1, &bytesRead) && bytesRead > 0) {
        if (buffer[0] == '\n') break; // 读到换行就停止,符合你说的单行文本场景
        content += buffer[0];
    }

    // 输出读取到的内容
    std::cout << "读取到的内容:\n" << content << std::endl;

    // 别忘了清理资源
    InternetCloseHandle(hUrl);
    InternetCloseHandle(hInternet);

    return 0;
}

编译的时候,用MSVC的话记得链接wininet.lib,比如命令行加/link wininet.lib,或者在IDE里把这个库加到依赖里。

Linux 平台(用原生Socket API)

Linux下直接用BSD Socket接口就行,这是内核自带的,不需要装任何额外库。同样针对单行文本做了优化:

#include <iostream>
#include <string>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <cstring>

int main() {
    // 创建Socket
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        std::cerr << "创建Socket失败" << std::endl;
        return 1;
    }

    // 解析pastebin的主机地址
    struct hostent* server = gethostbyname("pastebin.com");
    if (!server) {
        std::cerr << "无法解析pastebin主机地址" << std::endl;
        close(sockfd);
        return 1;
    }

    // 设置服务器地址结构体
    struct sockaddr_in serv_addr;
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    memcpy(&serv_addr.sin_addr.s_addr, server->h_addr, server->h_length);
    serv_addr.sin_port = htons(80); // HTTP默认端口是80

    // 连接到pastebin服务器
    if (connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
        std::cerr << "连接pastebin服务器失败" << std::endl;
        close(sockfd);
        return 1;
    }

    // 发送HTTP GET请求,要符合HTTP规范
    const char* request = "GET /raw/k1XLUS00 HTTP/1.1\r\nHost: pastebin.com\r\nConnection: close\r\n\r\n";
    ssize_t bytesSent = send(sockfd, request, strlen(request), 0);
    if (bytesSent < 0) {
        std::cerr << "发送GET请求失败" << std::endl;
        close(sockfd);
        return 1;
    }

    // 读取响应:先跳过HTTP头,再读取正文(单行就停)
    char buffer[1024];
    std::string content;
    bool headerEnded = false;
    ssize_t bytesRead;
    while ((bytesRead = read(sockfd, buffer, sizeof(buffer)-1)) > 0) {
        buffer[bytesRead] = '\0';
        if (!headerEnded) {
            // 找HTTP头结束的标志:两个连续的换行(\r\n\r\n)
            std::string temp(buffer);
            size_t headerPos = temp.find("\r\n\r\n");
            if (headerPos != std::string::npos) {
                headerEnded = true;
                // 提取头之后的正文内容
                content += temp.substr(headerPos + 4);
                // 检查有没有换行,有的话截断到换行前
                size_t newlinePos = content.find('\n');
                if (newlinePos != std::string::npos) {
                    content = content.substr(0, newlinePos);
                    break;
                }
            }
        } else {
            // 已经读到正文了,找换行就停
            std::string temp(buffer);
            size_t newlinePos = temp.find('\n');
            if (newlinePos != std::string::npos) {
                content += temp.substr(0, newlinePos);
                break;
            } else {
                content += temp;
            }
        }
    }

    // 输出结果
    std::cout << "读取到的内容:\n" << content << std::endl;

    // 关闭Socket
    close(sockfd);

    return 0;
}

编译直接用g++就行:g++ -o pastebin_reader pastebin_reader.cpp,不用加额外的链接参数。

小补充

  • 这两个方案都是完全无第三方依赖的,只用了系统自带的库;
  • 因为你的目标文件只有一行,所以代码里都做了优化,读到换行就停止读取,不用读多余的内容;
  • 如果以后要处理HTTPS地址的话,Windows可以改用WinHTTP,Linux可以用OpenSSL,但那样就需要链接额外库了——不过你现在的地址是HTTP的,上面的代码完全够用。

内容的提问来源于stack exchange,提问作者Jon Donkel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:05:02