В вашем коде есть несколько проблем
Имея
if((fptr = fopen("energy.txt", "r")) == NULL)
{
printf ("Error opening file ");
return 0;
}
while (fptr != NULL)
, вы не можете достичь , тогда как , если fptr равно NULL, и значение fptr никогда не изменяется в теле , тогда как , так что каждый является бесконечным l oop
Другая проблема возникает после для вы освобождаете valuesPtr , поэтому со второго хода вы будете писать в освобожденную память с неожиданной памятью. Весьма вероятно, что , тогда как просто бесполезен и может быть удален (но, конечно, для ).
Предположим, что while fini sh вы пытаетесь освободить fptr , но это не способ закрыть описание, вам нужно позвонить fclose (fptr) вместо free , ваш бесплатный имеет неопределенное поведение
Я рекомендую вам проверить возвращаемое значение с помощью fscanf , в настоящее время вы не можете знать, успешно это или нет. Обратите внимание, что fscanf также может записывать из полей, содержащих строку, поскольку вы не ограничиваете количество символов для чтения.
Если вы не можете открыть файл, вы можете указать причину, используя perror :
perror("Error opening file");
Предложение после редактирования:
#include <stdio.h>
#include <stdlib.h>
typedef struct value {
int num;
char start_vertex[250];
char destination_vertex[250];
} value;
int main()
{
const int nLines = 43; // number of lines in my text file
FILE * fptr;
value * valuesPtr = malloc(sizeof(value) * nLines);
if (!valuesPtr) {
puts("cannot allocate memory");
return -1;
}
if((fptr = fopen("energy.txt", "r")) == NULL)
{
perror("Error opening file");
return -1;
}
for(int i = 0; i < nLines; i++ )
{
if (fscanf(fptr, "%249s %249s %d",
valuesPtr[i].start_vertex,
valuesPtr[i].destination_vertex,
&valuesPtr[i].num) != 3) {
printf("errored file line %d\n", i);
break;
}
printf("\nStart vertex: %s \nDestination vertex: %s \nWeight: %d\n\n",
valuesPtr[i].start_vertex, valuesPtr[i].destination_vertex, valuesPtr[i].num);
}
free(valuesPtr);
fclose(fptr);
return 0;
}
Компиляция и исполнение:
pi@raspberrypi:/tmp $ gcc -Wall l.c
pi@raspberrypi:/tmp $ ./a.out
Start vertex: York
Destination vertex: Hull
Weight: 60
Start vertex: Leeds
Destination vertex: Doncaster
Weight: -47
Start vertex: Liverpool
Destination vertex: Nottingham
Weight: 161
Start vertex: Manchester
Destination vertex: Sheffield
Weight: 61
Start vertex: Reading
Destination vertex: Oxford
Weight: -43
Start vertex: Oxford
Destination vertex: Birmingham
Weight: 103
Start vertex: Birmingham
Destination vertex: Leicester
Weight: 63
Start vertex: Liverpool
Destination vertex: Blackpool
Weight: 79
Start vertex: Carlisle
Destination vertex: Newcastle
Weight: 92
Start vertex: Nottingham
Destination vertex: Birmingham
Weight: 77
Start vertex: Leeds
Destination vertex: York
Weight: 39
Start vertex: Glasgow
Destination vertex: Edinburgh
Weight: 74
Start vertex: Moffat
Destination vertex: Carlisle
Weight: 65
Start vertex: Doncaster
Destination vertex: Hull
Weight: 76
Start vertex: Northampton
Destination vertex: Birmingham
Weight: 90
Start vertex: Leicester
Destination vertex: Lincoln
Weight: 82
Start vertex: Sheffield
Destination vertex: Birmingham
Weight: 122
Start vertex: Lincoln
Destination vertex: Doncaster
Weight: 63
Start vertex: Sheffield
Destination vertex: Doncaster
Weight: 29
Start vertex: Bristol
Destination vertex: Reading
Weight: 130
Start vertex: Hull
Destination vertex: Nottingham
Weight: 145
Start vertex: Blackpool
Destination vertex: Leeds
Weight: 116
Start vertex: Birmingham
Destination vertex: Bristol
Weight: 139
Start vertex: Manchester
Destination vertex: Leeds
Weight: 64
Start vertex: Carlisle
Destination vertex: Blackpool
Weight: 140
Start vertex: Leicester
Destination vertex: Northampton
Weight: -61
Start vertex: Newcastle
Destination vertex: York
Weight: 135
Start vertex: Glasgow
Destination vertex: Moffat
Weight: -28
Start vertex: Leicester
Destination vertex: Sheffield
Weight: 100
Start vertex: Carlisle
Destination vertex: Liverpool
Weight: -30
Start vertex: Birmingham
Destination vertex: Manchester
Weight: 129
Start vertex: Oxford
Destination vertex: Bristol
Weight: 116
Start vertex: Leeds
Destination vertex: Hull
Weight: 89
Start vertex: Edinburgh
Destination vertex: Carlisle
Weight: 154
Start vertex: Nottingham
Destination vertex: Sheffield
Weight: 61
Start vertex: Liverpool
Destination vertex: Manchester
Weight: 56
Start vertex: Carlisle
Destination vertex: Glasgow
Weight: 50
Start vertex: Sheffield
Destination vertex: Lincoln
Weight: 74
Start vertex: York
Destination vertex: Doncaster
Weight: 55
Start vertex: Newcastle
Destination vertex: Edinburgh
Weight: 177
Start vertex: Leeds
Destination vertex: Sheffield
Weight: 53
Start vertex: Northampton
Destination vertex: Oxford
Weight: 68
Start vertex: Manchester
Destination vertex: Carlisle
Weight: 20
pi@raspberrypi:/tmp $
Я взял можно переименовать значения в значение , потому что struct сохраняет один элемент, а не несколько, в любом случае я рекомендую переименовать его в нечто более точное, значение очень общий. Я также использовал typedef , чтобы не нуждаться в struct везде, где он используется.
Посмотрите детали, например, для строки, которую я использую в формате % 249s , поскольку массивы содержат 250 символов (я удалил 1 для последнего нулевого символа), и, конечно, я проверяю, что он читает 3 элемента.