В этом коде 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);
_popen
функция создает труба. Каналы — это не обычные файлы, это однонаправленный поток байтов, в котором данные передаются от одного конца канала к другому (очень похоже на каналы в реальной жизни).
Если вам было разрешено искать через трубу, то вы можете только искать вперед. Любые данные, которые вы пропустите при поиске, исчезнут. Таким образом, даже если бы ему было позволено искать вперед, бессмысленно искать назад, поскольку в трубе нет обратного направления.
Также получить текущую позицию, используя ftell
не имеет смысла, поскольку перед «текущей» позицией в потоке действительно ничего не существует, поэтому «текущая» позиция всегда будет началом.
Если вы хотите читать выходные данные из канала динамически, то вы должны использовать динамическое распределение и перераспределение. Который в C ++ обычно должен обрабатываться std::vector
или же std::string
.
Других решений пока нет …