Lesen Zeilen aus c-Datei und setzen Sie die strings in ein array
Ich versuche, fügen Sie jede Zeile der c-Datei in ein array. Die Inhalte files.txt ist
first.c
second.c
third.c
fourth.c
Ich will, dass mein code drucken Sie diese Zeilen, fügen Sie die Zeile auf mein array, und dann drucken Sie jeden Eintrag in mein array. Jetzt tut es der erste Teil korrekt, aber es ist nur mehr vierte.c in das array. Kann mir jemand sagen, was falsch ist mit meinem code?
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i=0;
int numProgs=0;
char* programs[50];
char line[50];
FILE *file;
file = fopen("files.txt", "r");
while(fgets(line, sizeof line, file)!=NULL) {
//check to be sure reading correctly
printf("%s", line);
//add each filename into array of programs
programs[i]=line;
i++;
//count number of programs in file
numProgs++;
}
//check to be sure going into array correctly
for (int j=0 ; j<numProgs+1; j++) {
printf("\n%s", programs[j]);
}
fclose(file);
return 0;
}
- did u bedeuten
sizeof(line)
? sizeof line
korrekt ist auch.- Diese Zeile: Programme[i]=Zeile; wird nicht funktionieren, aus zwei Gründen. 1) das array von 50 Zeiger auf char haben muss, um die benötigte Zuordnung der Speicher (und der Einstellung der Zeiger auf diesen Speicher) für jede dieser 50-Pointer. Empfehlen die Verwendung von calloc (), so dass die memory-Segmente werden pre-set für alle '\0'. 2) alle auf diese Zeile macht, ist die Einstellung der Programme[i] Zeiger auf die array-Zeile[]. Was wirklich notwendig ist, ist so etwas wie: strcpy ("Programme" [i], Zeile );
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie ändern
zu
Sonst werden alle Zeiger in der
programs
array wird auf der gleichen Position (das istline
).BTW: wenn files.txt enthält mehr als 50 Zeilen, werden Sie in Schwierigkeiten geraten.
Bedarf reservieren Sie neuen Speicher für jede Zeile, sonst haben Sie nur die 1-Zeilen-Puffer zum speichern der Dateinamen, so dass nur der Letzte zeigt sich, tun Sie dies in der while-Schleife:
beim deklarieren
char *programs[50]
sind nicht gültigen Pointer. So haben Sie Speicher für jeden Zeiger, basierend auf jeder Linie Größe. Also, versuchen Sie diese.. (Hier bin ich mit malloc & strcpy)Keine Notwendigkeit für
i
es und zu speichern, alle Zeiger auf Zeilen im array müssen Siestrdup()
. Nur so machen:programs[numProgs++] = strdup(line);
In der zweiten Schleife Bedingung muss
j < numProgs
.Zusätzliche Bedingung, um Ihre while-Schleife zu verhindern, dass das schreiben übergeben Sie das Ende des array:
while(fgets(line, sizeof line, file)!=NULL && numProgs < 50)