sudo dd if=/dev/sda ibs=1 count=64 skip=446
명령을 사용하여 구문 분석을 위해 마스터 부트 레코드에서 파티션 테이블 정보를 얻으려고합니다. 기본적으로 구문 분석을 위해 문자열로 출력하지만 모두 다음과 같습니다. � !
. 내가 기대하고있어입니다 :C++ 프로그램에서 Linux 'dd'명령의 출력을 얻는 데 문제가 있음
80 01 01 00 83 FE 3F 01 3F 00 00 00 43 7D 00 00 00 00 01 02 83 FE 3F 0D 82 7D 00 00 0C F1 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
내 현재 코드는 다음과 같습니다, 그리고 여기에서 가져온 것입니다 : How to execute a command and get output of command within C++ using POSIX?
#include <iostream>
#include <stdexcept>
#include <stdio.h>
#include <string>
using namespace std;
string exec(const char* cmd) {
char buffer[128];
string result = "";
FILE* pipe = popen(cmd, "r");
if (!pipe) throw std::runtime_error("popen() failed!");
try {
while (!feof(pipe)) {
if (fgets(buffer, 128, pipe) != NULL)
result += buffer;
}
} catch (...) {
pclose(pipe);
throw;
}
pclose(pipe);
return result;
}
int main() {
string s = exec("sudo dd if=/dev/sda ibs=1 count=64 skip=446");
cout << s;
}
내가 뭔가를 잘못하고 있어요 분명히
하지만 내가 할 수있는 ' 문제를 찾아 내십시오. 내 문자열에 적절한 출력을 얻으려면 어떻게해야합니까?
그런데 왜 [while (! feof (file))가 항상 잘못 되었습니까?] (http://stackoverflow.com/questions/5431941/why-is-while-feof-file)를 읽어야합니다. -always-wrong) – molbdnilo
명령 줄에서 명령을 실행하면 출력이 예상 한 것입니까? 명령은 원시 이진 데이터를 덤프하기 때문에 심각하게 의심 스럽습니다. 원시 이진 데이터는 텍스트처럼 처리 될 수 없습니다. –
또한 왜 독서 루프를'try-catch'에 넣고 있습니까? 예외를 일으킬 수있는 유일한 것은 문자열에 추가하는 동안 메모리가 부족한 경우입니다. 그렇더라도 프로그램 종료로 인해 파이프가 닫히기 때문에 실용적인 필요는 없습니다. –