Я уже давно пытаюсь понять это, и мне кажется, что я должен быть рядом. В принципе, у меня есть файл данных, содержащий различные записи в стране, разделенные новыми строками. Каждая запись содержит поля, разделенные запятыми, из которых я пытаюсь извлечь некоторые из них.Как читать строку с запятой в текстовом файле и вставлять ее поля в массив указателей на структуру?
Например (в виде одной строки):
60, AFG, Афганистан, Азии, Южной и Центральной Азии, 652090,1919,22720000,45.9,5976, Afganistan/Afqanestan, Исламский Эмират, Мохаммад Омар, 1, AF
Каждая из этих линий будет составлять структуру. По сути, я хочу прочитать каждую из этих строк и вставить ее в массив указателей на структуру (так динамически). Мне также нужны только определенные поля. Когда я «маркирую» строку, мне нужны поля для кода, имени, популяции и жизни expec. соответственно:
AFG, Афганистан, 22720000, 45.
Моя мысль была использовать fgets(), чтобы прочитать каждую строку в файле, а в таНос петли() немного памяти для указателей, разметить на поля, которые я хочу, затем вставьте. Однако то, что я делаю, должно быть ошибочным, поскольку различные тесты, похоже, ничего не показывают в моем выпуске.
Вот моя работа до сих пор. Я был бы признателен за любую помощь.
#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);
}
Предлагает Вам сделать некоторые основные отладки. С отладчиком или даже базовыми отладочными операциями печати. Например, проверьте «буфер» и «токен» после каждой строки цикла. – kaylum
Для начала 'index' не инициализирован. Что-то вы должны уметь легко обнаружить с помощью некоторой базовой отладки, как было предложено. – kaylum
Теперь, когда вы исправили проблему «индекса», следующая проблема заключается в том, что ваши буферы «code» недостаточно велики; 'char code [3];'. Строки в C завершают NUL. Таким образом, чтобы сохранить 3-строчную строку, вам нужно 4 'char's. Таким образом, у вас есть переполнение буфера, что приводит к Undefined Behavior. – kaylum