Отображение содержимого текстового файла - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток всем. Набрал на Си алгоритм поиска простых чисел - решето Эратосфена. Входной файл INPUT.TXT содержит два натуральных числа M и N, разделенных пробелом (2 <= n <= m <= 10^6) В выходной файл OUTPUT.TXT вывожу все простые числа от n до m в порядке возрастания. Код:
#include <stdio.h>
#include <math.h>
#include <time.h>
 
#define MAX_NUM 1000001
 
void main(int argc, char *argv[])
{
    ///Открываем файлы и получаем исходные данные.
    FILE *input = fopen("input.txt", "r");
    FILE *output = fopen("output.txt", "w");
    long int m, n;
    fscanf(input, "%d %d", &n, &m);
 
    long int i, sqrt_m = (int) floor(sqrt((double) m));
    static long int arr[MAX_NUM];
 
    ///В качестве искомых простых чисел выступают индексы массива arr. arr[i] == 0 - простое, arr[i] != 0 - составное.
    arr[0] = arr[1] = 1;
 
    long int j = 1;
    while (++j < sqrt_m) {              ///От 2 до корня из m
        if (arr[j] != 1)                ///Если число j - простое
            for (i = j*j; i <= m; i+=j) ///В заданном интервале помечаем числа, делящиеся на j, как составные.
                arr[i] = 1;
    }
 
    ///Вывод в файл.
    for (i = n; i <= m; i++) {
        if (arr[i] == 0) fprintf(output, "%d ", i);
    }
 
    ///Заканчиваем работу с файлами.
    fclose(input); fclose(output);
 
    ///Отображает время выполнения программы.
    printf("Time: %f sec.\n", (float)clock() / CLOCKS_PER_SEC);
    system("pause");
    return;
}
Работает, в общем-то верно. Но когда интервал n..m приблизительно 10000 и больше. То в выходном файле в большинстве случаев вижу такую белиберду: Но иногда числа отображаются корректно. Еще раз хочу отметить, что программа работает верно и, если выводить числа на экран, никаких проблем не возникает. Использую Code::blocks. Подскажите пожалуйста, в чем может быть проблема?

Решение задачи: «Отображение содержимого текстового файла»

textual
Листинг программы
         if (kk && !(kk %25))
         {
            fprintf(pOut,"\n");
            kk = 0;
         }

Объяснение кода листинга программы

  1. Проверка условия kk && !(kk %25).
  2. Если условие истинно, то выполняется блок кода внутри фигурных скобок.
  3. В блоке кода выполняется команда fprintf(pOut,\n);, которая выводит символ новой строки в файл pOut.
  4. Переменная kk обновляется значением 0.
  5. Если условие в начале блока кода было истинно, то после выполнения команд внутри блока кода выполнение программы продолжится с шага 1.
  6. Если условие в начале блока кода было ложно, то выполнение программы продолжится с команды после закрывающей фигурной скобки.

Оцени полезность:

6   голосов , оценка 4.333 из 5
Похожие ответы