2016-04-09 3 views
0

Ich versuche Speicherinformationen in eine Zeichenfolge in c zu lesen, und ich habe ein bisschen Probleme. Hier ist, was ich derzeit habe.Datei in Zeichenfolge in C kopieren

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

Ich bin in der Lage, Zeile zu drucken, aber nicht zu Puffer hinzufügen. Vielen Dank im Voraus für die Hilfe.

+1

Ich denke 'char * line [128];' sollte 'char Linie sein [128];' –

+0

Sie richtig sind, habe ich es falsch von meinem Code. Jetzt bearbeitet. – chrisz

+2

Was meinen Sie mit "nicht zu Puffer hinzufügen"? Wie hast du * 'buffer' erstellt, zugewiesen und * initialisiert? Woher weißt du, wie lang die Daten sind, die du gelesen hast? Sie können nicht von einer Pfeife suchen (was 'popen' hinter den Kulissen verwendet). Können Sie bitte versuchen, ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve) zu erstellen und uns zu zeigen? –

Antwort

2

Eine kleine Änderung an meinem vorherigen Kommentar und das Problem mit Ihrem Code jetzt, dass wir es sehen können: Wenn Sie eine Rohrleitung haben, können Sie nur vorwärts, nicht rückwärts suchen. Sobald Sie bis zum Ende gesucht haben, können Sie nicht mehr zurückgehen und alle Daten sind verloren.

Stattdessen müssen Sie den Puffer bei jeder Iteration dynamisch zuweisen und reallocate zuweisen.

+0

Vielen Dank, war in der Lage, dies zur Arbeit zu bringen. Danke auch für die Erklärung! – chrisz

0

Sie lesen binäre Daten aus der Datei. Daher können Sie es nicht als eine mit Null beendete Zeichenfolge behandeln.

Verwenden Sie memcpy() anstelle von strcat.

+0

Nichts in der Frage sagt, dass die Daten binär sind, ganz im Gegenteil, wenn die Datei mit 'popen' mit einem Befehl geöffnet wird, der Text ausgibt. –

+0

Er liest den "freien" Befehl. Ich glaube, es ist eine Binärdatei. – eyalm

+1

Nein, das OP verwendet die Funktion 'popen', um die * Ausgabe * aus dem Befehl zu lesen. –

0

Hier ist ein funktionierendes Beispiel:

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