_popen(dir, rt) fseek(dir, and ftell() returns 0
_popen(dir, rt) fseek(dir, and ftell() returns 0
在此代码中,ftell(dir) returns 0。但是当我使用 fread_s() 阅读时,所有预期的文本都出现了。知道为什么 ftell() returns 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
函数创建了一个 管道 。管道不是普通文件,它是一个 one-way byte-stream,数据从管道的一端流向另一端(很像现实生活中的管道)。
如果允许你通过管道寻找,那么你只能向前寻找。您跳过搜索的任何数据都将消失。因此,即使允许向前寻找,向后寻找也没有任何意义,因为管道中没有反向。
同样使用 ftell
获取当前位置是没有意义的,因为在流中的 "current" 位置之前确实不存在任何东西,所以 "current" 位置将永远是开始。
如果你想动态地从管道读取输出,那么你必须使用动态分配和重新分配。在 C++ 中,通常应由 std::vector
or std::string
.
处理
在此代码中,ftell(dir) returns 0。但是当我使用 fread_s() 阅读时,所有预期的文本都出现了。知道为什么 ftell() returns 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
函数创建了一个 管道 。管道不是普通文件,它是一个 one-way byte-stream,数据从管道的一端流向另一端(很像现实生活中的管道)。
如果允许你通过管道寻找,那么你只能向前寻找。您跳过搜索的任何数据都将消失。因此,即使允许向前寻找,向后寻找也没有任何意义,因为管道中没有反向。
同样使用 ftell
获取当前位置是没有意义的,因为在流中的 "current" 位置之前确实不存在任何东西,所以 "current" 位置将永远是开始。
如果你想动态地从管道读取输出,那么你必须使用动态分配和重新分配。在 C++ 中,通常应由 std::vector
or std::string
.