Обновление: решено
Источником ошибок были две вещи. Во-первых, указатель после прохождения первой секунды цикла while createRecords()оставался в конце массива и фактически возвращал конец массива. Во-вторых, в первом цикле while creatRecords()было условие, которое не позволяло собирать больше строк, поскольку я отлаживал и не хотел проходить 7 тыс. строк данных. Массив будет иметь только 1 структуру, но при возврате и проверке в main цикл for пройдет более 10 раз. Только одна допустимая структура была действительной, а остальные были мусором.
Исходные файлы здесь Написано на C для проекта в университете. Мне нужно организовать и запросить данные о маршруте самолета из файла CSV, чтобы пользователь мог искать информацию и данные о маршруте. Есть 6 столбцов данных для представления: [month(as a number), origin, destination, airline, type, total number of passengers in that month for that route]. Ниже приведен пример строки данных:
6,TEB,RIX,LF,Passenger,2
Часть задания требует, чтобы я создал динамически выделяемый массив структур. Структура для строки данных записывается route-records.hи выглядит следующим образом:
typedef struct RouteRecord_struct{
char origin[4];
char destin[4];
char aaCode[4];
int passengersPerMonth[6];
}RouteRecord;
Примечание. Вы не видите type, что каждый рейс относится к типу пассажирских, поэтому тип в данном случае не имеет значения.
Присваивание вызывает функцию createRecords(FILE* fileIn), которая делает следующее:
- Проходит по файлу CVS и подсчитывает общее количество записей маршрута (строк).
- Создайте динамически выделяемый массив структур на основе количества строк.
- Каждая
RouteRecordструктура имеет массив из 6 целых чисел, где каждый индекс содержит количество пассажиров за 6 месяцев. Установите каждый элемент в массиве целых чисел равным 0. - Верните сгенерированный указатель на некоторый указатель в
main.
Где у меня есть проблемы Set each element in the integer array to 0. На данный момент я успешно создал динамический массив в createRecords()функции. Однако, когда я возвращаю указатель обратно на main и распечатываю элемент, чтобы проверить, работает ли он, я получаю мусорные значения. Но когда я печатал значения в createRecords()функции, значение устанавливается и равняется любому значению, которое я установил как (3, 999, 75 и т. д.).
Код - это то, что у меня есть ниже, и вывод следует.
main.c
#include <stdio.h>
#include <stdlib.h>
#include "route-records.h"
int main(){
FILE *fileIn;
fileIn = fopen("data.csv", "r");
if(fileIn == NULL){
printf("Could not open file");
return -1;
}
RouteRecord *records = createRecords(fileIn);
// Print the first 10 integer arrays in the first 10 structs
int i;
for(i = 0; i < 10; i++){
int j;
for(j = 0; j < 6; j++){
printf("%d ", records->passengersPerMonth[j]);
}
printf("\n");
records++;
}
return 0;
}
route-records.c
#include <stdio.h>
#include <stdlib.h>
#include "route-records.h"
RouteRecord* createRecords(FILE* fileIn){
char currentLine[50];
int lineCount = 0;
int s = 0;
// Get the total amount of lines.
while(fgets(currentLine, 50, fileIn)){
if(s == 1){
lineCount++;
}
else{
s = 1;
}
}
// Create the dynamic array
RouteRecord* returnPtr = (RouteRecord*)malloc(sizeof(RouteRecord) * lineCount);
// Set every index in the array of each struct to 0
int i = 0;
while(i < lineCount){
int j;
for(j = 0; j < 6; j++){
records->passengersPerMonth[j] = 0;
}
i++;
returnPtr++;
}
return returnPtr;
}
route-records.h
typedef struct RouteRecord_struct{
char originAirlineCode[4];
char destinAirlineCode[4];
char airlineCode[4];
int passengersPerMonth[6];
}RouteRecord;
RouteRecord* createRecords(FILE*);
Output
>./output
12155696 12155696 12155696 12155696 12155696 12155696
1866670145 1866670145 1866670145 1866670145 1866670145 1866670145
1095516483 1095516483 1095516483 1095516483 1095516483 1095516483
7102819 7102819 7102819 7102819 7102819 7102819
1380270669 1380270669 1380270669 1380270669 1380270669 1380270669
1551069797 1551069797 1551069797 1551069797 1551069797 1551069797
1432107587 1432107587 1432107587 1432107587 1432107587 1432107587
1381319519 1381319519 1381319519 1381319519 1381319519 1381319519
1414422387 1414422387 1414422387 1414422387 1414422387 1414422387
1551066476 1551066476 1551066476 1551066476 1551066476 1551066476
Я чувствую, что каким-то образом испортил возврат массива или создание массива. Печать их в основном, чтобы убедиться, что они возвращены правильно, не приводит к тому, что мне нужно. Я попытался создать новый указатель в main, который указывает на массив записей, но это не работает. Я понятия не имею, что вызывает это, и я не хочу переделывать весь код, чтобы заставить его работать. Любые идеи? Любая помощь приветствуется.
Решение проблемы
Обновление
решения SparKot работает. В моем основном коде я установил условие, которое не позволяло печатать, сохраняя больше строк в while(fgets)циклах. Я забыл, что у меня это было, потому что в исходном файле CVS 7k строк, и не хотел проходить через все 7k.
Комментариев нет:
Отправить комментарий