Как читать и данные из текстового файла в структуру массива в C программирования? - PullRequest
1 голос
/ 20 мая 2019

Используя функцию, программа должна читать данные из каждой строки в виде информации об имени автомобиля, типе груза, весе (полная), длине, требуемой лошадиной силе, чтобы тянуть этот тип автомобиля, и количестве автомобилей этого типа.Данные должны храниться в массиве структур, так как они читаются из файла, а затем отображаются в консоли.Необходимо использовать функцию strsub().

К сожалению, данные из текстового файла не выводятся на консоль.Я думаю, что проблема может заключаться в моем использовании указателей, но я прочитал главу об этом более пяти раз.И если это действительно печатает, только бредовые печатные издания.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
FILE *fpIn;

void strsub(char buf[], char sub[], int start, int end);
void readFile();

typedef struct {
    char name[10];
    char type[1];
    float weight;
    int length;
    int power;
    int amount;
}data;

// Substring extractor function from book
void strsub(char buf[], char sub[], int start, int end){
    int i, j;

    for (j = 0, i = start; i <= end ; i++, j++){
        sub[j] = buf[i];
    }
    sub[j] = '\0';
}

// Prints out file
void outFile(data* train) {

    printf(" Name: %s ", train->name);
    printf(" Type: %s ", train->type);
    printf(" Weight: %.2f ", train->weight);
    printf(" Length: %d ", train->length);
    printf(" Horsepower: %d ", train->power);
    printf(" Number in Train: %d ", train->amount);

}

// Reads file
void readFile(){
    int count = 0;
    data train[MAX];

    // Opens file
    if(!(fpIn = fopen("traindata.txt", "r"))){
        printf("Error. File can not be opened. \n");
    }

    // Reads each line of text in file
    while (!feof(fpIn)){
        char buf[MAX+2];
        char weightbuf[5];
        char lengthbuf[3];
        char powerbuf[2];
        char amountbuf[3];

        fgets(buf, MAX, fpIn);
        strsub(buf, train[count].name, 0, 8);
        strsub(buf, train[count].type, 10, 10);
        strsub(buf, weightbuf, 12, 16);
        strsub(buf, lengthbuf, 18, 20);
        strsub(buf, powerbuf, 22, 23);
        strsub(buf, amountbuf, 25, 27);
        train[count].weight = atof(weightbuf);
        train[count].length = atoi(lengthbuf);
        train[count].amount = atoi(amountbuf);
        train[count].power = atoi(powerbuf);
        ++count;
    }

    for (int i = 0; i < count; ++i){
        data* train = &train[i];
        outFile(train);
    }
}

int main(int argc, char *argv[]) {
    printf("This table shows the current Train Cars\n\n");
    readFile();

    return 0;
}

Expected results:
Boxcar    D 44000 55 16 45
Hopper    B 23000 62 18 33
Tanker    G 15000 45 30 12
Autocar   A 30000 37 23 6
Livestock L 56500 50 18 19
Coalcar   C 49300 53 22 100
Flatcar   F 18000 66 15 25

Current Display:
This table shows the current Train Cars

 Name: ����  Type:   Weight: 0.00  Length: 20  Horsepower: 1696  Number in Train: -2112880507

Error?:
data* train = &train[i];
  - Local variable "train" might not have been initialized

1 Ответ

3 голосов
/ 20 мая 2019
  1. Неправильный размер массива.
    char type[1];
    printf(" Type: %s ", train->type);

Type не может содержать символ \0 при передаче его на printf или при доступе за пределы, у вас неопределенное поведение.

Решение:

char type;
train[count].type = buf[10]; //Do not call substr function.
printf(" Type: %c ", train->type);

  1. Проблема с областью действия.
    for (int i = 0; i < count; ++i){
        data* train = &train[i];
        outFile(train);
    }

Здесь train как массив имеет более высокий приоритет по сравнению с train как указатель, таким образом, вы неосознанно передаете train как массив функции outFile.

Решение:

for (int i = 0; i < count; ++i){
    data* pTrain = &train[i];
    outFile(pTrain );
}

Предложение: использовать sscanf функцию.

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