Не удается найти все строки в массиве Struct - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь использовать fscanf () в массиве struct. Я следовал предложенному решению до создания этого поста, но по некоторым причинам это не похоже на чтение всех данных в файле. Это только начало того, что мне нужно завершить, так как позже мне придется отсортировать элементы в моей структуре.

#define LCOUNT 128  // Sizeof of single line
#define ROW_COUNT 2 // Number of lines in file

struct Hurricane {
    char Year[50];
    char Name[50];  
    char State[50];
};

int main() {

    struct Hurricane hurricane[ROW_COUNT]; // Declare hurricane of type Hurricane array

    // File operations
    FILE *fptr = fopen("hurricane.txt", "r");

    // Return error if file no bueno
    if (fptr == NULL) {
        fprintf (stderr, "Failed to open file");
        return -1;
    }

    // Start of row
    int ROW;

    // Read comma as delimiter into Struct
    while(ROW != ROW_COUNT) {

            fscanf(fptr, "%[^,],%[^,],%[^,]\n", &hurricane[ROW].Year, &hurricane[ROW].Name, &hurricane[ROW].State);
            printf("%s\t%s\t%s\n", hurricane[ROW].Year, hurricane[ROW].Name, hurricane[ROW].State);
            ROW++;

    }

    // Close file
    fclose(fptr);

    return 0;
}

И содержимое моих файлов:

1960, Донна, FL-N C

1969, Камиль, MS

1972, Агнес, FL

А затем вывод:

1960 Donna FL-N C

1969

---------------------------- ---- Процесс завершен через 0,02288 секунд с возвращаемым значением 0 Нажмите любую клавишу для продолжения. , .

1 Ответ

2 голосов
/ 11 апреля 2020
  • ROW_COUNT должно быть 3, а не 2
  • ROW должно быть инициализировано, как упоминает bruno в комментариях: int ROW = 0;
  • вызов fscanf должен выглядеть следующим образом

    fscanf(fptr, "%[^,],%[^,],%[^\n]\n", hurricane[ROW].Year, hurricane[ROW].Name, hurricane[ROW].State);
    

Если вы ищете ,%[^,] в качестве последней части строки, то читайте до следующей запятой, но ваша строка не заканчивается запятой. Поэтому лучше использовать, например, %[^\n].

...