Ich habe versucht, dieses eine für eine Weile jetzt herauszufinden, und ich fühle mich wie ich nah sein muss. Grundsätzlich habe ich eine Datei mit verschiedenen Ländereinträgen, die durch neue Zeilen getrennt sind. Jeder Datensatz enthält durch Komma getrennte Felder, von denen ich versuche, bestimmte zu extrahieren.Wie lese ich eine durch Kommas getrennte Zeile in einer Textdatei und füge ihre Felder in ein Array von Strukturzeigern ein?
Zum Beispiel (in einer einzigen Zeile):
60, AFG, Afghanistan, Asien, Süd- und Zentralasien, 652090,1919,22720000,45.9,5976, Afganistan/Afqanestan, Islamisches Emirat, Mohammad Omar, 1, AF
Jede dieser Zeilen bildet eine Struktur. Im Wesentlichen möchte ich jede dieser Zeilen lesen und sie in ein Array von Strukturzeigern (so dynamisch) einfügen. Ich möchte auch nur bestimmte Felder. Wenn ich die Zeile "Tokenize" möchte ich die Felder für Code, Name, Bevölkerung und Lebenserwartung. jeweils:
AFG, Afghanistan, 22720000, 45.
Mein Gedanke war, verwenden fgets(), um jede Zeile in der Datei zu lesen, und in einer Schleife malloc() etwas Speicher für die Zeiger, tokenize auf die Felder, die ich will, dann einfügen. Allerdings muss etwas, was ich mache, falsch sein, da verschiedene Tests nichts in meiner Ausgabe zu zeigen scheinen.
Hier ist meine bisherige Arbeit. Ich würde jede und jede Hilfe schätzen.
#include "allheaders.h" // contains all common headers for personal use
#define BUF_SIZE 512
#define NUM_RECS 238
typedef struct {
char code[4];
char name[40];
int population;
float lifeExpectancy;
} Country;
typedef Country *countryPtr;
int main(int argc, const char* argv[]) {
/* Opening the file */
FILE *filePtr; // pointer to file
if ((filePtr = fopen("AllCountries.dat", "r")) == NULL) { // if couldn't open file
printf("Error opening file\n"); // error message
exit(1);
}
/* Reading the file */
char buffer[BUF_SIZE]; // buffer to read
int index = 0;
char *token;
countryPtr *myCountries = malloc(sizeof(*myCountries) * NUM_RECS);
for(int i = 0; i < NUM_RECS; ++i) {
myCountries[i] = malloc(sizeof(*myCountries[i]));
}
while (fgets(buffer, BUF_SIZE, filePtr) != NULL) {
token = strtok(buffer,",");
token = strtok(NULL, ",");
strcpy(myCountries[index]->code, token);
token = strtok(NULL, ",");
strcpy(myCountries[index]->name, token);
token = strtok(NULL, ",");
token = strtok(NULL, ",");
token = strtok(NULL, ",");
token = strtok(NULL, ",");
token = strtok(NULL, ",");
myCountries[index]->population = atoi(token);
token = strtok(NULL, ",");
myCountries[index]->lifeExpectancy = atof(token);
//printf("%s", buffer);
index++;
}
printf("%s", myCountries[1]->code); // test?
free(myCountries);
}
Schlagen Sie ein paar grundlegende Debugging. Mit einem Debugger oder sogar grundlegenden Debug-Print-Anweisungen. Untersuchen Sie zum Beispiel "Puffer" und "Token" nach jeder Zeile in der Schleife. – kaylum
Für Starter ist "Index" nicht initialisiert. Etwas, das Sie mit einem einfachen Debugging wie vorgeschlagen leicht erkennen können. – kaylum
Jetzt, da Sie das 'Index' Problem behoben haben, ist das nächste Problem, dass Ihre' Code' Puffer nicht groß genug sind; 'Zeichencode [3];'. Zeichenfolgen in C sind NUL-terminiert. Um eine 3-Buchstaben-Zeichenfolge zu speichern, benötigen Sie also 4 Zeichen. Sie haben also Pufferüberläufe, die zu einem nicht definierten Verhalten führen. – kaylum