У меня возникли проблемы с получением моей программы, которая предназначена для генерации последовательности Фибоначчи в файл, а затем для ее чтения. Я не уверен, что проблема r = заключается в сканировании или печати, но я продолжаю получать очень длинные неправильные номера
#include<stdio.h>
int main(){
//Step 1
int N;
scanf(" %d", &N);
if(N > 2){
printf("You entered argument: %d\n", N);}
else{
printf("That is an illegal argument. N must be greater than 2.");
return 0;}
unsigned long a = 1;
unsigned long b = 1;
unsigned long c;
int count = 2;
FILE *fib;
fib = fopen("Fibonacci", "w+");
if (fib == NULL) {
printf("Open TestFile failed\n");
return -1;}
fprintf(fib, "%lu %lu ",a,b);
printf("%lu %lu ",a,b);
for(count; count < N; count++){
if(count % 4 == 0){
fprintf(fib, "\n");
printf("\n");}
c = a+b;
if(c < a){
printf("integer overflow, ending number generation.");
break;}
fprintf(fib, "%lu ",c);
printf("%lu ",c);
a = b;
b = c;
}
fflush(fib);
printf("\ncount = %d",count);
//Step 2
unsigned long med;
int middle;
unsigned long nums[count];
int j;
if(count % 2 == 1){
middle = (count/2);
for(j = 0; j < count; j++){
fscanf(fib, "%lu", &nums[j]);}
med = nums[middle];
printf("\nmedian = %lu", med);}
unsigned long test1 = nums[0];
unsigned long test2 = nums [1];
unsigned long test3 = nums [2];
printf("\nnums array: %lu %lu %lu",test1, test2, test3);
return 0;
}
Если входной сигнал равен 3, выход
You entered argument: 3
1 1 2
count = 3
median = 221891732872
nums array: 140733854067968 221891732872 26447888
Вы также можете:
rewind(fib);
вызова rewind(fib);
для сброса указателя файла на начало файлаfclose(fib);
, а затем снова открыть его с помощью fopen("Fibonacci", "r");
, и в этом случае первый вызов fopen
может просто иметь "w"
в качестве второго аргумента. Я не являюсь большим поклонником r+/w+
, и на практике их практически нет (imo), если вы не обрабатываете специальные файлы, такие как /dev/mem
или что-то еще.
Как отметил Джонни Мопп, вы не перематываете файл, поэтому на втором этапе вы уже находитесь в конце файла при чтении. Если бы вы протестировали код возврата для другого scanf, это было бы очевидно.
Вы должны либо закрыть, либо снова открыть файл, либо позвонить
fseek(fib, 0L, SEEK_SET);
в начале шага 2
В любом случае: всегда проверяйте результат входных функций.