2016-04-09 8 views
0

メモリ情報をC言語の文字列に読み込もうとしていますが、少し問題があります。ここに私が現在持っているものがあります。ファイルをC言語の文字列にコピー

FILE * fpipe; 
long length; 
char * command = "free"; 
fpipe = (FILE*) popen(command, "r"))); 

fseek(fpipe, 0, SEEK_END); 
length = ftell(fpipe); 
fseek(fpipe, 0, SEEK_SET); 
bufer = (char*) malloc(length); 

char line[128]; 
if(fpipe) 
{ 
    while(fgets(line, sizeof line, fpipe)) 
    { 
     strcat(buffer, line); 
    } 
} 

私は行を印刷できますが、バッファには追加できません。助けを前にありがとう。

+1

私は 'のchar *ライン[128]だと思う;' 'char型のライン[128]でなければなりません;' –

+0

あなたが正しい、私は自分のコードから、誤ってそれを書きました。今編集されました。 – chrisz

+2

「バッファに追加しない」とはどういう意味ですか?あなたはどのようにして 'buffer 'を作り、割り当てて*初期化しましたか?あなたが読んだデータの長さのサイズをどうやって知っていますか?あなたはパイプからシークできません(これは 'popen'がシーンの裏で使うものです)。あなたは、[最小、完全で、かつ実証可能な例](http://stackoverflow.com/help/mcve)を作成して私たちを見せてください。 –

答えて

2

私の前回のコメントとコードの問題を少し修正しました。パイプがある場合は、を転送先にしか戻せません。一度あなたが最後まで追いかけたら、もう戻ることができず、すべてのデータが失われます。

代わりに、バッファを動的に割り当てる必要があります。reallocateここで

+0

ありがとうございました、これを動作させることができました。説明してくれてありがとう! – chrisz

0

ファイルからバイナリデータを読み取っています。したがって、ヌル終了文字列として扱うことはできません。

strcatの代わりにmemcpy()を使用してください。

+0

質問には、データがバイナリであるとは言われていません。テキストを出力するコマンドで 'popen'を使ってファイルを開くと、全く反対になります。 –

+0

彼は「フリー」コマンドを読みます。私はそれがバイナリファイルだと信じています。 – eyalm

+1

いいえ、OPは 'popen'関数を使用してコマンドから*出力*を読み取ります。 –

0

は実施例である:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main(void) 
{ 

char *command="ls -ltr"; 
FILE* fp; 
char line[128]; 
char* buffer=NULL; // Buffer to store the string 
unsigned int size=0; 
fp=popen(command,"r"); 
while (fgets(line,sizeof(line),fp)) 
    { 
    size+=strlen(line); 
    strcat(buffer=realloc(buffer,size),line); 
    } 

printf("Contents received from pipe\n "); 
fputs(buffer,stdout); 

free(buffer); 
fclose(fp); 
return 0; 
} 
関連する問題