В вашем коде есть несколько проблем
1) printf("ERROR Creating File!");
- плохое сообщение, вы не пытаетесь создать файл, вы открываете его для чтения внутри
2) num[5] = 0;
имеет неопределенное поведение, потому что вы пишете из num , размер которого равен 5 (int num[5];
)
3) free(filer);
filer является FILE *
, поведение не определено, что вы хотели сделать?Это очень вероятно причина вашего:
Более того, иногда, после различных итераций, программа останавливается с ошибкой "double free or коррупция (! Prev)", что вызывает ее?
4) get = 0;
бесполезен, вы не используете get , прежде чем назначить его снова с результатом rand ()
5) r = 0;
также бесполезен, потому что вы не используете r , прежде чем делать scanf (" %c", &r);
6) srand(time(0));
, что должно быть сделано только один раз в начале программы,не несколько раз, потому что если вы сделаете два раза за одну секунду, rand()
вернет одно и то же значение.
7) вы делаете
for (n = 0; n < 5; n++){
fscanf(filer, "%d\n", &num[n]);
}
для каждого do .. while
, но вы никогда не возвращаетесь к началу файла, поэтому каждый раз, когда вы прогрессируете и не проверяете конецфайл.Когда вы достигаете конца файла, fscanf(filer, "%d\n", &num[n]);
ничего не делает и num не изменяется.
Вам просто нужно прочитать числа из файла только один раз в начале выполнения
8) Вы просите rand () вернуть значение в диапазоне от 1 до 27, так что возможностей мало, поэтому, вероятно, у вас есть:
чисел всписок часто извлекается.
Здесь предложение с учетом замечаний (кроме последнего о диапазоне значений), numbers.txt не ограничивается5 номеров.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define rangeMAX 27 //Upper limit of range.
#define rangeMIN 1 //Lower limit of range.
int main()
{
srand(time(0)); // this will ensure that every time, program will generate different set of numbers. If you remove this, same set of numbers will generated every time you run the program.
FILE * filer = fopen("numbers.txt", "r");
if (filer == NULL)
{
printf("ERROR cannot read numbers.txt");
exit(1);
}
int * nums = NULL;
int num;
size_t sz = 0, nnums = 0;
while (fscanf(filer, "%d", &num) == 1) {
if (nnums == sz) {
sz += 100;
nums = realloc(nums, sz * sizeof(int));
}
nums[nnums++] = num;
}
fclose(filer);
printf("When you are ready press any key to continue\n");
getchar();
char yn[16];
do {
int get = ((rand() % (rangeMAX-rangeMIN+1)) + rangeMIN); // generate random number.
size_t i = 0;
for (;;) {
if (i == nnums) {
printf("%d is not in the file\n", get);
break;
}
if (get == nums[i]) {
printf("%d is the number rank %d in the file\n", get, i + 1);
break;
}
i += 1;
}
printf ("Do you want another number? Y/N ");
if (scanf ("%15s", yn) != 1)
break;
} while (*yn == 'y' || *yn == 'Y');
return(0);
}
Компиляция и исполнение:
pi@raspberrypi:/tmp $ gcc -pedantic -Wall -g r.c
pi@raspberrypi:/tmp $ cat numbers.txt
1 3 7 9 10 20 23
pi@raspberrypi:/tmp $ ./a.out
When you are ready press any key to continue
12 is not in the file
Do you want another number? Y/N Y
12 is not in the file
Do you want another number? Y/N Y
4 is not in the file
Do you want another number? Y/N Y
3 is the number rank 2 in the file
Do you want another number? Y/N Y
12 is not in the file
Do you want another number? Y/N Y
15 is not in the file
Do you want another number? Y/N Y
16 is not in the file
Do you want another number? Y/N Y
8 is not in the file
Do you want another number? Y/N N