私は基本的にはマスターブートレコードからパーティションテーブル情報を取得して構文解析するために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'に入れていますか?例外を引き起こす可能性があるのは、文字列に追加するときにメモリ不足が発生した場合だけです。それでも、プログラムの終了はパイプを閉じてしまい、実用的な必要はありません。 –