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

Копирование данных через указатели - C++

Восстановить пароль Регистрация
 
vvApache
5 / 5 / 0
Регистрация: 08.05.2011
Сообщений: 121
06.07.2012, 09:41     Копирование данных через указатели #1
Здравствуйте! Работаю над прототипом файловой системы, возникла проблема с функцией копирования:

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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//копирует папку или файл указателями
    void copy (string path_from, string path_to, directory * dir)
    {
        directory * dir_from;
        directory * dir_to;
        file * file_from=NULL;
        file * file_to;
        //попробую перекинуть указатели просто(лол просто)
        //шаг 1. найти папку/файл из from
        //сохранить както её чтобы потом передать ей указатель и от неё(наоборот)
        //шаг2. найти дестинейшн для той же ^ цели
 
        //eсли вначале есть слеш, удалить слеш
        string lol; 
        lol=path_from[0];
        if(lol.compare("/")==0) path_from.erase(0,1);
 
        //разбить входную строку на части
        string * paths= new string[100];
        int i = split(paths, path_from, "/");
        // paths[i-2]
        // ^ это папка в которой лежит последний файл/папка
        //сейчас её адрес нужно найти файндом
        //сформируем строку для поиска:
        string temp = path_from;
        int slen=0;
        for(int k=0; k<i-1; k++)
        {
            slen=slen+paths[k].length();
        }
        slen=slen+i-2;
        temp.erase(slen,paths[i-1].length()+1);
 
        //получаем указатель на from папку:
        dir_from = find(temp, dir);
 
        //смотрим в ней или папку или файл paths[i-1]
        for(int k=0; k<100; k++)
        {
            //если нашли папку
            if(dir_from->dirs[k].name.compare(paths[i-1])==0)
            {
                
                //просто меняем указатель
                dir_from=&dir_from->dirs[k];
                break;
            }
                        //если нашли файл
            if(dir_from->files[k].name.compare(paths[i-1])==0)
            {
                //записываем указатель
                file_from=&dir_from->files[k];
                break;
            }
        }
 
        //ищем конечную папку
        dir_to=find(path_to, dir);
 
        //если найден файл:
        if(file_from != NULL)
        {
            int t;
            //dir_to это папка где должен быть наш файл
            //file_from это указатель на наш файл
            //нужно сделать указатель на пустое место в папке где нужно сделать запись
            for(int k=0; k<100; k++)
            {
                if(dir_to->files[k].name.compare("")==0)
                {
                    t=k;
                    break;
                }
            }
            file_to=&dir_to->files[t];  //сделали его
            //теперь мы имеем указатели file_from и file_to 
            //нужно file_from >> file_to
            *file_to = *file_from;
            //ещё нужно поменять пути:
            file_to->path=dir_to->path+ "/" + file_to->name;
        }
        else //если найдена папка
        {
            string t_path;
            //нужно сделать указатель на пустое место в папке где нужно сделать запись
            for(int k=0; k<100; k++)
            {
                if(dir_to->dirs[k].name.compare("")==0)
                {
                    t_path=dir_to->path;
                    dir_to=&dir_to->dirs[k];  //сделали его
                    break;
                }
            }
 
            // имеем указатели dir_to и dir_from
            *dir_to = *dir_from;
            //ещё нужно поменять пути:
            dir_to->path=t_path+ "/" + dir_to->name;
 
 
            //это ещё не всё
            //если так оставить то будут просто дубли содержимого
            //нужно скопировать все файлы ещё
            //и все папки, и все что в папках
 
            //для всех непустых файлов
            if(dir_from->files != NULL)
            {
                for(int k=0; k<3; k++)
                {
                    if(dir_from->files[k].name.compare("")!=0)
                    {
                        copy(dir_from->files[k].path, dir_to->path, dir);
                    }
                }
            }
            if(dir_from->dirs != NULL)
                {
                //для всех непустых папок
                for(int k=0; k<3; k++)
                {
                    if(dir_from->dirs[k].name.compare("")!=0)
                    {
                        copy(dir_from->dirs[k].path, dir_to->path, dir);
                    }
                    
                }
            }
        }
    }
которая работает со структурами:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct file {
public:
    string name;                    //имя
    string path;                    //путь к файлу
    string isLocked;                //NULL-не заблокирован, ""-заблокировавший пользователь 
};
 
 
struct directory {
public:
    string name;                    //имя
    string path;                    //путь к папке
    directory* dirs;        //массив вложенных папок
    file* files;           //массив содержащихся файлов
};
Проблема в том, что при копировании папок или файлов через указатели, копируемый текущий элемент копируется в уже существующую пустующую ячейку, а файлы и папки внутри него остаются указывать на те же самые внутренние файлы и папки которые были

нужно как-то (как?) инициализировать заново то, что внутри у скопированного элемента.
пробовал так:

C++
1
2
3
4
5
6
7
8
9
10
void dir_init(directory *dir)
    {
        dir->dirs = new directory[100];
        dir->files = new file[100];
        for(int i=0; i<100; i++) 
        {
            dir->dirs[i].dirs=NULL;
            dir->dirs[i].files=NULL;
        }
    }
использовать для:
C++
1
dir_init(dir_to);
но ничего не меняется.

Добавлено через 7 часов 41 минуту
как ещё можно инициализировать их?

Добавлено через 13 минут
проблема решилась легко и элегантно, close
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2012, 09:41     Копирование данных через указатели
Посмотрите здесь:

C++ массив через указатели
C++ Массивы через указатели
C++ программа сделана через указатели, переделать через ссылки.
Переписать через указатели C++
C++ ошибка с передачей через указатели
переделать программу через указатели C++
Запись данных в динамический массив через указатели C++
Факториал числа через указатели C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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