Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 28.04.2014
Сообщений: 12

Отображение содержимого текстового файла

28.04.2014, 12:14. Показов 2068. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток всем. Набрал на Си алгоритм поиска простых чисел - решето Эратосфена.

Входной файл INPUT.TXT содержит два натуральных числа M и N, разделенных пробелом (2 <= n <= m <= 10^6)
В выходной файл OUTPUT.TXT вывожу все простые числа от n до m в порядке возрастания.

Код:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#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. Подскажите пожалуйста, в чем может быть проблема?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.04.2014, 12:14
Ответы с готовыми решениями:

Написать программу для считывания содержимого текстового файла
1 написать программу для считывания содержимого текстового файла. 2 Написать программу для сохранения системой даты и времени в текстовый...

Сортировка содержимого текстового файла методами пузырька, слияния, Шелла
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; main() { int N,i; FILE *out; out=fopen(&quot;gen.txt&quot;,&quot;w&quot;); for(N=0;N&lt;1000000;N++) ...

Написать программу по разбивке и анализу содержимого файла отчета работы ПО (log-файла)
Здравствуйте, задача такова: Написать программу по разбивке и анализу содержимого файла отчета работы ПО (log-файла). ...

8
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
28.04.2014, 13:49
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <stdio.h>
#include <math.h>
#include <time.h>
 
#define MAX_NUM         (1000000L)
 
int main(int argc,char** argv)
{
   // Открываем файлы и получаем исходные данные.
   FILE*    pIn = fopen("input.txt","rt");
 
   if (!pIn)
   {
      // Error !
      return -1;
   }
 
   FILE*    pOut = fopen("output.txt","wt");
 
   if (!pOut)
   {
      // Error !
      fclose(pIn);
      return -1;
   }
 
   long int nn = 0;
   long int mm = 0;
 
   fscanf(pIn,"%d %d",&nn,&mm);
 
   long int sqrt_m = (long int)floor(sqrt((double)mm));
 
   static long int      arr[MAX_NUM];
 
   // В качестве искомых простых чисел выступают индексы массива arr. 
   // arr[i] == 0 - простое, arr[i] != 0 - составное.
   arr[0] = 1;
   arr[1] = 1;
 
   int ii = 0;
   int jj = 1;
 
   while (++jj < sqrt_m) // От 2 до корня из m
   {
      if (arr[jj] != 1) // Если число j - простое
      {
         // В заданном интервале помечаем числа, делящиеся на j, как составные.
         for (ii = jj * jj; ii <= mm; ii += jj) 
         {
            arr[ii] = 1;
         }
      }
   }
 
   int   kk = 0;
 
   // Вывод в файл.
   for (ii = nn; ii <= mm; ++ii)
   {
      if (!arr[ii])
      {
         fprintf(pOut,"%d ",ii);
         ++kk;
 
         if (kk && !(kk %10))
         {
            fprintf(pOut,"\n");
            kk = 0;
         }
      }
   }
 
   // Заканчиваем работу с файлами.
   fprintf(pOut,"\n");
 
   fclose(pIn);
   fclose(pOut);
 
   // Отображает время выполнения программы.
   printf("Time: %f sec.\n",(float)clock() / CLOCKS_PER_SEC);
 
   return 0;
}
Вложения
Тип файла: 7z test.7z (10.0 Кб, 3 просмотров)
0
0 / 0 / 0
Регистрация: 28.04.2014
Сообщений: 12
28.04.2014, 16:22  [ТС]
gazlan, так... Я поэтапно устранял различия между вашим кодом и моим, и выяснилось, что ключевое разница в том, как вы выводите информацию в output.txt. А именно в том, что каждые 10 выведенных символов вы переводите строку.

Я менял это значение и получилось, что если я перевожу строку каждые 24 символа, то все выводится нормально. При 25 и выше, проблема снова возвращается.

Теперь мне интересно, почему это происходит, и как вывести числа в одну строку? К сожалению, в интернете ничего нет на такую тему. Объясните, пожалуйста, в чем дело? )
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
28.04.2014, 19:21
Цитата Сообщение от Kency Посмотреть сообщение
переводите строку
Видите ли, я убежден, что люди, которые не думают о стиле и лепят что-то вроде void main, просто обязаны писать неверный и неработающий код.

В данном случае, вы выводите в бинарный файл.
0
0 / 0 / 0
Регистрация: 28.04.2014
Сообщений: 12
29.04.2014, 10:53  [ТС]
Да, возможно стиль не идеален. На то я пишу в разделе для новичков)

Но, если и в вашем, стилистически верном коде заменить:
C
1
2
3
4
5
         if (kk && !(kk %10))
         {
            fprintf(pOut,"\n");
            kk = 0;
         }
на:
C
1
2
3
4
5
         if (kk && !(kk %25))
         {
            fprintf(pOut,"\n");
            kk = 0;
         }
мы снова получаем ошибку с выводом.

А как быть, если мне нужно вывести символы именно одной строкой?
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
29.04.2014, 13:56
Цитата Сообщение от Kency Посмотреть сообщение
как быть
Если быть до конца честным :-), у меня (MSVC 6.0) работает любой вариант - даже ваш исходный. Где, на самом деле, проблема, нельзя сказать, не видя сгенерированного файла. Это может быть как кривая среда (что там у вас компилятором?), так и глючный текстовый редактор, неспособный распарсить длинную строку.

Приложите к посту (архивом) пару файлов input.txt, output.txt - из тех, что у вас отображаются иероглифами.
Вложения
Тип файла: 7z test.7z (10.6 Кб, 2 просмотров)
0
0 / 0 / 0
Регистрация: 28.04.2014
Сообщений: 12
30.04.2014, 15:04  [ТС]
Я использую gnu gcc compiler. Прикрепил архив с exe-шником и результатами.

upd: добавил еще один тест с иероглифами. Что интересно, при входных данных 100тыс 200тыс, как у вас - работает, как и у вас, верно.
Вложения
Тип файла: 7z архив.7z (330.4 Кб, 2 просмотров)
Тип файла: 7z тест2.7z (2.4 Кб, 2 просмотров)
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
30.04.2014, 19:02
Лучший ответ Сообщение было отмечено Kency как решение

Решение

Цитата Сообщение от Kency Посмотреть сообщение
добавил еще один тест с иероглифами
Угу. Все ОК - с обоими архивами. Запустил ваш EXE у себя - тоже ОК. Просматриваю в FAR.

BUG в самом текстовом редакторе, которым вы это просматриваете - надо полагать, он не в состоянии распарсить длинную текстовую строку.
Миниатюры
Отображение содержимого текстового файла  
1
0 / 0 / 0
Регистрация: 28.04.2014
Сообщений: 12
01.05.2014, 15:02  [ТС]
Просматриваю обычным виндовым блокнотом. Дело в том, что, если входные данные 2 10000 - то на выходе я наблюдаю китайские символы. Если входные данные 100000 200000 - то на выходе все ок. Хотя во втором случае, по идее, строка должна быть длиннее за счет того, что символов в каждом числе больше.

В общем. Попробовал я открыть output.txt другими текстовыми редакторами - действительно все ок. Видимо, это какой-то специфичный баг блокнота...Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.05.2014, 15:02
Помогаю со студенческими работами здесь

Запросить имя текстового файла и вывести на экран количество компонентов файла
Запросить имя текстового файла и вывести на экран количество компонентов файла. напишите полный код программы. Спасибо вам за ранее:)

Вывод содержимого файла
У меня вот такой вопрос. Как ссылаясь на путь файла вывести его содержимое на экран . И если так можно, то какие типы файлом могут...

Вывод содержимого файла
Как вывести содержимое текстового файла на экран printf(&quot;%s&quot;,name); Выводит только первый символ.

Чтение содержимого файла в массив
Как аккуратно записать содержимое файла в массив, если файл может быть произвольной длины? На ум приходит такой способ: 1) Читаем файл...

Копирование содержимого одного файла в другой
Всем доброго времени суток. Заранее извиняюсь за глупый вопрос я еще новичок. Вот решаю одну задачку и дошел до момента когда надо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru