2016-04-09 27 views
0

içine dize haline getirme Bellek bilgilerini c'deki bir dize okumaya çalışıyorum ve biraz sorun yaşıyorum. İşte şu an sahip olduğum şey.Dosyayı 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); 
    } 
} 

Satır basabiliyorum ancak arabelleğe ekleyemiyorum. Yardım için şimdiden teşekkür ederiz.

+1

Bence 'Char * hat [128];' 'olmak kömürleşme hattı [128] etmelidir; Haklısın' –

+0

, benim kodundan yanlış yazdım. Şimdi düzenlenmiş. – chrisz

+2

"Tampona eklemeyin" ile ne demek istiyorsun? * Tamponu nasıl oluşturdunuz, tahsis ettiniz ve * başlattınız? Okuduğunuz verilerin uzunluğunun boyutunu nasıl biliyorsunuz? Bir borudan (perde arkasından kullandıran şey) arama yapamazsınız. Lütfen [Minimal, Tam ve Doğrulanabilir Bir Örnek] (http://stackoverflow.com/help/mcve) oluşturmayı ve bize göstermeyi deneyebilir misiniz? –

cevap

2

Önceki yorumumla ilgili ufak bir değişiklik ve kodunuzla ilgili sorunu şu anda görebiliyoruz: Eğer bir borunuz varsa, geriye doğru değil sadece ileri numaralı telefonu arayabilirsiniz. Sonuna kadar aradığınızda, artık geri dönemezsiniz ve tüm veriler kaybolur. Bunun yerine, her yineleme arabelleğini dinamik olarak ayırmanız ve reallocate arabelleğe almanız gerekir. İşte

+0

Çok teşekkürler, bunu işe almak mümkün oldu. Açıklama için de teşekkürler! – chrisz

0

Dosyadan ikili veri okuyorsunuz. Bu nedenle, onu boş sonlandırılmış bir dize olarak ele alamazsınız.

strcat yerine memcpy() kullanın.

+0

Sorunun içindeki hiçbir şey, verilerin metin olduğunu söyleyen bir komutla 'popen' kullanılarak açıldığında, verilerin ikili olduğunu, tam tersini söyleyemez. –

+0

"Serbest" komutunu okur. İkili bir dosya olduğuna inanıyorum. – eyalm

+1

Hayır, OP, komuttan * çıkışı * okumak için 'popen' işlevini kullanır. –

0

çalışan bir örnektir:

#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; 
}