Форум программистов, компьютерный форум CyberForum.ru

Почему правильно работает код? - C++

Восстановить пароль Регистрация
 
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.04.2013, 09:05     Почему правильно работает код? #1
В первом файле 5 слов, во втором - 10.

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
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    FILE *f1, *f2;
    f1 = fopen("1.txt", "r");
 
    char temp[20];
 
    int count1 = 0;
    while(!feof(f1)) // количество слов в первом файле
    {
        fscanf(f1,"%s", temp);
        ++count1;
    }
    printf("count1 = ");
    printf("%d%c", count1, '\n');
    fclose(f1);
 
    f2 = fopen("2.txt", "r");
 
    int count2 = 0;
    while(!feof(f1)) // количество слов во втором файле
    {
        fscanf(f2,"%s", temp);
        ++count2;
    }
    printf("count2 = ");
    printf("%d%c", count2, '\n');
 
    fclose(f2);
 
    return 0;
}
При подсчёте количества слов во втором файле, выход из while() по достижению конца файла потоком, связанным с первым файлом, который уже закрыт. Тем не менее, подсчёт верный.
Миниатюры
Почему правильно работает код?  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
03.04.2013, 09:11     Почему правильно работает код? #2
Ну у меня такое предположение:
Здесь выделяется память под описатель файла:
f1 = fopen("1.txt", "r");
Здесь память очищается, но f1 не обнуляется, а продолжает указывать на ту же область памяти:
fclose(f1);
Здесь выделяется память под второй описатель файла, но так как память под f1 уже свободна, используется тот же блок памяти:
f2 = fopen("2.txt", "r");

В итоге f1 и f2 указывают на одну и ту же память, поэтому у тебя все работает. Чуть изменятся условия или программа и все работать перестанет....
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
03.04.2013, 09:16     Почему правильно работает код? #3
Ну так f1 закрыли - ресурсы освободили.
Опять сделали fopen - получили тот же идентификатор, что до этого освободили.
Получается, что f2==f1

Добавлено через 1 минуту
Например, попробуйте открыть так:

C++
1
2
3
4
fclose(f1);
f3=fopen("c:\\cpp\\1.txt", "r");
f2 = fopen("c:\\cpp\\2.txt", "r");
fclose(f3);
anmartex
...
 Аватар для anmartex
1699 / 1192 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
03.04.2013, 09:16     Почему правильно работает код? #4
alsav22, а вы в строчке 22 воткните следующее:
C
1
printf("%x %x\n", (unsigned)f1, (unsigned)f2);
Я думаю всё станет на свои места. :-)
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
03.04.2013, 09:23     Почему правильно работает код? #5
Цитата Сообщение от alsav22 Посмотреть сообщение
При подсчёте количества слов во втором файле, выход из while() по достижению конца файла потоком, связанным с первым файлом,
Как только ты закрыл файл, поток от него отвязался.
Yandex
Объявления
03.04.2013, 09:23     Почему правильно работает код?
Ответ Создать тему
Опции темы

Текущее время: 02:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru