Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Alexxx7
98 / 34 / 5
Регистрация: 24.04.2012
Сообщений: 151
#1

Странное поведение функций _findfirst() и _findnext() - C++

14.02.2013, 15:29. Просмотров 955. Ответов 7
Метки нет (Все метки)

в материалах по С++ дан пример работы с файлами, переименование, удаление и просмотр содержимого директории.
Просмотр осуществляется с помощью структуры fileinfo и функций _findfirst() и _findnext(). Вопрос следующий, в каждой папке у меня оказывается по 2 дополнительных файла с именем точка и две точки, почему?

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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <stdio.h>
#include <io.h>       
#include <string.h>
#include <iostream>
using namespace std;
#include <windows.h>
void RenameFile();
void RemoveFile();   
void Dir();    
void main()
{
    // предлагаем выбрать пункт меню для выполнения
    cout << "Please, select preffer number...\n";
    //выбор пользователя
    char ch; 
    do{
        // Переименовать
        cout << "\n1 - Rename\n";
        // Удалить   
        cout << "2 - Remove\n";   
        // Просмотреть некоторую папку(каталог)
        cout << "3 - View some folder\n";   
        // Выход
        cout << "0 - Exit\n\n";    
        cin >> ch;
 
        // анализируем и вызываем 
        // соответствующую  функцию
        switch(ch)
        {
            case '1':
                RenameFile();   
            break;
            case '2':
                RemoveFile();   
            break;
            case '3':
                Dir();
            break;
        }           
    } while(ch != '0');      // Выход из программы
}
// Переименовать существующий файл
void RenameFile()       
{
    char oldName[50], newName[50];
    // В одной переменной запомним существующее имя (oldName), 
    cout << "Enter old name:";
    cin >> oldName;
    // А в другой новое имя(newName)
    cout << "Enter new name:";
    cin >> newName;
    // Произведем переименование и проверку результата
    if (rename(oldName, newName) != 0)
        cout << "Error!\n Couldn't rename file. Check old and new filename...\n\n";
    else 
        cout << "Ok...\n\n";
}
// Удалить существующий файл
void RemoveFile()           
{
    char Name[50];
    // Получаем имя и путь к удаляемому файлу
    cout << "Enter name:";
    cin >> Name;
 
    //Удаляем файл и проверяем результат    
    if (remove(Name) != 0)
        cout << "Error!\n Couldn't remove file. Check filename...\n";
    else 
        cout << "Ok...\n" ;
}
// Поиск файлов в каталоге
void Dir()                        
{
    // Запросим ПУТЬ (например, папка Temp на диске C, запишется 
    // таким вот образом: c:\temp\)
    char path[70];
    cout << "\nEnter full path (for example, C:\\):";
    cin >> path;
    // Запросим маску файлов 
    char mask[15];
    cout << "\nEnter mask (for example, *.* or *.txt):";
    cin >> mask;
    // Соединив две строки, мы получим результат
    // т.е. что хочет найти пользователь и где
    strcat(path, mask);
    // Объявление указателя fileinfo на структуру _finddata_t
    // и создание динамического объекта структуры _finddata_t
    _finddata_t *fileinfo=new _finddata_t;  
    // Начинаем поиск
    long done = _findfirst(path,fileinfo);
    // если done будет равняться -1, 
    // то поиск вести бесмысленно
    int MayWeWork = done;   
    // Счетчик, содержит информацию о количестве найденых файлов.   
    int count = 0;   
    while (MayWeWork!=-1)
    {   
        count++;
        // перекодировали имя найденного файла
        // на случай, если оно кириллическое
        AnsiToOem(fileinfo->name,fileinfo->name);
        // Распечатали имя найденного файла
        cout << fileinfo->name << "\n\n"; 
        // Пытаемся найти следующий файл из группы
        MayWeWork = _findnext(done, fileinfo);        
    }
    // Вывод сообщения о количестве найденных файлов.
    cout << "\nInformation: was found " << count;
    cout << " file(s) in folder..." << path << "\n\n";
    // Очистка памяти
    _findclose(done);
    delete fileinfo;
}
0
Миниатюры
Странное поведение функций _findfirst() и _findnext()  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.02.2013, 15:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Странное поведение функций _findfirst() и _findnext() (C++):

Странное поведение new - C++
Объясните почему оператор new выделяет неверное количество памяти? # include &lt;iostream&gt; using namespace std; char* interpitator( int...

Странное поведение - C++
Здравствуйте еще раз :) Теперь возникла другая непонятка. Есть класс StringParser, объекты которого умеют разбивать строку на подстроки,...

Странное поведение транслятора - C++
В следуюшем примере код компилируется нормально, но объект класса b не содается (пробывал на Visual studio 10 и на Borland builder 5), что...

Странное поведение указателя - C++
#include &lt;iostream&gt; #include &lt;cstring&gt; int main(){ char line1=&quot;hello world!&quot;; char line2=&quot;hell word!&quot;; int...

Странное поведение указателей - C++
Здравствуйте, может кто-нибудь объяснить столь странное поведение указателя. Вот код. int main() { const int Width = 3; ...

Странное поведение getline - C++
В программе в двух местах используеться getline. В первом случае все супер : string ownerName; getline (cin, ownerName); А во...

7
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,044
Записей в блоге: 17
14.02.2013, 15:48 #2
. - текущий каталог
.. - каталог выше на уровень от текущего ( родительский по отношению к текущему )
0
Alexxx7
98 / 34 / 5
Регистрация: 24.04.2012
Сообщений: 151
14.02.2013, 15:55  [ТС] #3
Это нормальная работа этих функций? Это значит что текущий каталог существует, что существует так же каталог на порядок выше, и в работе это при отстутсвии необходимости надо игнорировать?
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,044
Записей в блоге: 17
14.02.2013, 15:57 #4
Ну не знаю насколько это нормально, обычно эти точки просто выкидывают при переборе файлов ( имеется ввиду в коде предусматривоют)

И если у вас установлен boost то я бы использовал boost/filesystem - он как по мне удобнее...
1
Байт
Эксперт C
16545 / 10815 / 1639
Регистрация: 24.12.2010
Сообщений: 20,864
14.02.2013, 16:25 #5
Цитата Сообщение от Alexxx7 Посмотреть сообщение
2 дополнительных файла с именем точка и две точки, почему?
Как только создается папка (некорневая) тут же операционка создает в ней 2 папки "." и ".." Так что это происходит автоматом и сэтим поделать ничего нельзя (да и не надо). А при переборе просто их пропускай и все дела.
1
VadimuSSS
2 / 2 / 0
Регистрация: 23.06.2014
Сообщений: 166
10.02.2016, 03:18 #6
Байт,
C++
1
2
3
4
if (fileinfo->name != "." && fileinfo->name != "..")
            {
                //тут код для других папок. не для "." и ".."
            }
таким образом пропустить их не удается...как же тогда?
0
cyber-satyr
393 / 164 / 28
Регистрация: 10.12.2015
Сообщений: 751
10.02.2016, 04:18 #7
ну если учесть особенность современных систем windows, в которых явно запрещено называть файлы с точки, то достаточно будет проверять только первый символ.

Добавлено через 53 секунды
Для пользователей unix подобных систем в "этих странных точках" нет ничего ни нового, ни удивительного.
0
nd2
2384 / 1973 / 693
Регистрация: 29.01.2016
Сообщений: 6,422
10.02.2016, 05:27 #8
Цитата Сообщение от VadimuSSS Посмотреть сообщение
как же тогда?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//...
    int count = 0;   
    while (MayWeWork!=-1)
    {   
        
        // перекодировали имя найденного файла
        // на случай, если оно кириллическое
        AnsiToOem(fileinfo->name,fileinfo->name);
        // Распечатали имя найденного файла
        if (strcmp(fileinfo->name,  ".") != 0 && strcmp(fileinfo->name,  "..") != 0)
        {
            count++;
            cout << fileinfo->name << "\n\n";
        }
        // Пытаемся найти следующий файл из группы
        MayWeWork = _findnext(done, fileinfo);        
    }
//...
1
10.02.2016, 05:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2016, 05:27
Привет! Вот еще темы с ответами:

странное поведение fstream - C++
ниже представлен черновой код курсача. как из него видно я пытаюсь работать с файлами, но у меня ничего не выходит. а именно: я создаю...

Странное поведение (сдвиг) - C++
Здравствуйте.Прошу помочь с задачкой. Программа , должна &quot;сдвигать&quot; данные в один бит(128), но при вызове функции с разными параметрами,...

Странное поведение wstring - C++
Всем привет! Ребята, не могу понять такую ситуацию. Вставляю в wstring строку в позицию 0 таким образом ...

Странное поведение в коде - C++
Есть два класса: ArrayList&lt;T&gt; и Array&lt;T&gt; (реализация в конце поста). И есть такой код: ArrayList&lt;int&gt; list = { 1, 2, 3 }; ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru