2016-05-04 17 views
2

Hallo Ich schreibe ein Programm, um Befehle aus der Textdatei auszuführen. Der Code unten wird verwendet, um Zeile für Zeile zuerst in Char-Array zu speichern. SoSpeichern von Zeile für Zeile aus Textdatei in Char-Array mit Char-Zeiger

Ich erwarte, dass es so etwas wie

args[0]= The first line of text file 
args[1]= The second line of text file 
... and so on 

In meinem Code zu tun, würden alle der Arrays von der letzten Reihe abgedeckt werden. Und ich kann nicht herausfinden warum.

Kann mir jemand helfen, dies zu beheben und mir sagen, warum mein Code das tut. Außerdem muss ich char * args [] behalten. cos würde ich später mit execvp() verwenden.

int main(int argc, const char * av[]) {  
    FILE *fp;  
    fp = fopen(av[1],"r"); 

    int n_lines=0;   
    char in[100],*args[16];   
    int size=sizeof(in); 

    while(fgets(in, size, fp)!=NULL){   
     args[n_lines] = in;     
     printf("Args[0] is %s\n",args[0]);    
     n_lines++; 
    } 

    printf("Now Args[0] is %s\n",args[0]); 
} 

Ausgabe

zacks-MacBook-Pro:prac2 zack$ ./a.out test  
Args[0] is ./addone  
Args[0] is ./add  
Now Args[0] is ./add 
+1

Einzeln von Ihnen Problem: Sie wissen, dass Sie auf Probleme stoßen werden, wenn Ihre Datei mehr als 16 Zeilen. –

+1

Unabhängig von Ihrem Problem sollten Sie überprüfen, ob die Datei vorhanden ist und den Dateizeiger schließen, wenn Inhalt gelesen wird ... – user3078414

Antwort

2
int n_lines=0;   
char in[100],*args[16];   
int size=sizeof(in); 

while(fgets(in, size, fp)!=NULL){   
    args[n_lines] = in;     
    printf("Args[0] is %s\n",args[0]);    
    n_lines++; 
} 

Der Wert in bei jeder Iteration überschrieben wird, müssen Sie Platz reservieren (mit malloc->strcpy oder strdup falls vorhanden):

char in[100], *args[16]; 

while (fgets(in, sizeof in, fp) != NULL) { 
    args[n_lines] = strdup(in); 
    ... 
    n_lines++; 
} 

Or Verwenden Sie ein 2D-Array (eine Anpassung von sizeof ist inerforderlich):

char in[16][100]; 

while (fgets(in[n_lines], sizeof in[0], fp) != NULL) { 
    ... 
    n_lines++; 
} 

Und wie durch @MichaelWalz in Kommentaren darauf hingewiesen: Sie werden auf Probleme stoßen, wenn die Datei mehr als 16 Zeilen.

Wechsel zu

while (fgets(in[n_lines], sizeof in[0], fp) != NULL) { 
    ... 
    if (++n_lines == (sizeof in/sizeof in[0])) break; 
} 
+0

@MichaelWalz, danke für die Bearbeitung, mein Englisch ist sehr schlecht :) –

+2

Es ist nicht so schlecht. –