Разбиение строки из текстового файла на отдельные переменные в C - PullRequest
0 голосов
/ 09 марта 2019

В настоящее время я работаю над программой, которая считывает файл с именем accidents.txt, в котором содержатся данные о дорожно-транспортных происшествиях со смертельным исходом, и организует данные в три различные структуры в зависимости от времени аварии.

Формат текстового файла:

время (24-часовой формат) numOfVehicles numOfFatalities

Несколько строк из текстового файла:

2   2   1
18  3   1
1   1   1
7   2   1
19  1   1

Важно отметить, что они разделены вкладками (/ t).

У меня есть вся написанная программа, и она должна работать, кроме чтения в реальном файле и разделения строк для сохранения в моих структурах. Вся цель программы - сложить общее количество несчастных случаев, транспортных средств и смертельных случаев, связанных с каждым периодом времени, и вывести его.

Что-то в операторе while, особенно начало оператора while, неверно. После нескольких часов попыток выяснить, что я делаю неправильно, я не могу понять это. Ниже мой код.

#include <stdio.h>
#include <stdlib.h>

// Structure for organizing file data
struct stats {
    int accidents, vehicles, fatalities;
    double vehAccRat;
};

int main(void) {
    // Declare file pointer
    FILE *fp;

    char line[256];

    // Declare file name
    char* filename = "accidents.txt";

    // Declare structure variables
    struct stats morning;
    struct stats afternoon;
    struct stats night;

    // Open a file using fopen function then assign it to the file pointer
    fp = fopen(filename, "r");

    // If file is not found, exit program
    if (!fp){
        printf("Could not open file %s",filename);
        exit(1);
    } // End of if statement

    // Iterate through file by each line and store data into respective time frame
    while (fgets(line, sizeof(line),fp) != NULL) {
        // Store line data in array
        char *val1 = strtok(NULL, "/t");
        char *val2 = strtok(NULL, "/t");
        char *val3 = strtok(NULL, "/t");

        // If time is from 6 - 12 add data to morning statistics
        if (val1 <= 6 && val1 >= 12) {
            morning.accidents += 1;
            morning.vehicles += val2;
            morning.fatalities += val3;
        } // End of if statement

        // If time is from 13 - 19 add data to afternoon statistics
        else if (val1 <= 13 && val1 >= 19) {
            afternoon.accidents += 1;
            afternoon.vehicles += val2;
            afternoon.fatalities += val3;
        } // End of else if statement

        // If time is from 20 - 23 or 0 - 5 add data to night statistics
        else if ((val1 <= 20 && val1 >= 23) || (val1 <= 0 && val1 >= 5)) {
            night.accidents += 1;
            night.vehicles += val2;
            night.fatalities += val3;
        } // End of else if statement
    } // End of while loop

    // Close the file stream
    fclose(fp);

    // Calculate vehicle / accident ratio for each time group
    morning.vehAccRat = morning.vehicles / morning.accidents;
    afternoon.vehAccRat = afternoon.vehicles / afternoon.accidents;
    night.vehAccRat = night.vehicles / night.accidents;

    // Output data organized by time of day (morning/afternoon/night)
    printf("Time Span\tAccidents\tVehicles\tFatals\t\tVeh./Acc.\n");
    printf("-------------------------------------------------------------------------\n");
    printf("Morning\t\t%d\t\t%d\t\t%d\t\t%.4f\n", morning.accidents, morning.vehicles, morning.fatalities, morning.vehAccRat);
    printf("Afternoon\t%d\t\t%d\t\t%d\t\t%.4f\n", afternoon.accidents, afternoon.vehicles, afternoon.fatalities, afternoon.vehAccRat);
    printf("Night\t\t%d\t\t%d\t\t%d\t\t%.4f\n", night.accidents, night.vehicles, night.fatalities, night.vehAccRat);
    printf("-------------------------------------------------------------------------");

} // End of int main(void)

Заранее спасибо за любую помощь, я в полном недоумении.

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

Я думаю, sscanf из fscanf будут вашими друзьями здесь.

Цикл может быть заменен следующим, чтобы прочитать каждое из трех значений в строке в целые числа:

 int val1, val2, val3;
 while(fscanf(fp, "%d%d%d", &val1, &val2, &val3) == 3){

Вы также можете использовать sscanf в line в вашей текущей реализации, но это кажется ненужным.

0 голосов
/ 09 марта 2019

Одна вещь, которую я заметил, это то, что первый вызов strtok должен иметь строку tokenise, затем последующие, имеющие NULL, но все ваши имеют NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...