0

在这段代码中, ftell(dir) 返回 0。但是当我使用 fread_s() 阅读时,所有预期的文本都出现了。知道为什么 ftell() 在这种情况下返回 0 吗?

FILE* dir = _popen("dir", "rt");
    if (dir == NULL) {
        send(socket, "0", 10, 0);
        cerr << "\nerror opening dir" << endl;
        return;
    }
    int r = fseek(dir, 0, SEEK_END);
    if (r != 0) {
        send(socket, "0", 10, 0);
        cerr << "\nerror seeking end" << endl;
        return;
    }
    long dirLength = ftell(dir);
    fseek(dir, 0, SEEK_SET);
    cout << "dirLength " << dirLength << endl;
    char dirListLength[10];
    memset(dirListLength, 0, 10);
    sprintf_s(dirListLength, 10, "%u", dirLength);
    cout << "dirListLength " << dirListLength << endl;
    send(socket, dirListLength, 10, 0);

    long sentDir = 0;
    char buffer[BUFFER_SIZE];
    memset(buffer, 0, BUFFER_SIZE);
    while (fread_s(buffer, BUFFER_SIZE, sizeof(char), BUFFER_SIZE, dir) > 0) {
        send(socket, buffer, BUFFER_SIZE, 0);
        cout << buffer << endl;
        cout << 1 << endl;
        memset(buffer, 0, BUFFER_SIZE);
    }
    _pclose(dir);
4

1 回答 1

0

_popen函数创建一个管道。管道不是普通文件,它是一种单向字节流,数据从管道的一端流向另一端(很像现实生活中的管道)。

如果你被允许通过管道寻找,那么你只能向前寻找。您在搜索中跳过的任何数据都将消失。因此,即使允许它向前搜索,向后搜索也没有任何意义,因为管道中没有反向方向。

使用获取当前位置ftell也没有任何意义,因为在流中的“当前”位置之前确实不存在任何东西,所以“当前”位置将始终是开始。

如果要动态读取管道的输出,则必须使用动态分配和重新分配。C++ 中的哪个通常应该由std::vectoror处理std::string

于 2018-04-03T19:34:16.443 回答