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

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

Войти
Регистрация
Восстановить пароль
 
vvApache
5 / 5 / 0
Регистрация: 08.05.2011
Сообщений: 121
#1

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

06.07.2012, 09:41. Просмотров 511. Ответов 0
Метки нет (Все метки)

Здравствуйте! Работаю над прототипом файловой системы, возникла проблема с функцией копирования:

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
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2012, 09:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Копирование данных через указатели (C++):

Запись данных в динамический массив через указатели - C++
Здравствуйте! У меня возникла проблема... Когда я ввожу, например, 10 чисел в дин. массив, цикл while(через который я и хочу организовать...

Указатели и указатели на указатели, а также типы данных - C++
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...

Через указатели на указатели посчитать сумму двух чисел и записать в третье - C++
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать примитивный калькулятор, пользуясь только...

Написать программу сортировки через указатели на указатели - C++
Вот моя программа #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; using namespace std; //Сортировка &quot;пузырьком&quot;. ...

Указатели на строки, копирование строк - C++
Подскажите пожалуйста такой момент #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; int main() { char*...

заполнение массива через rand и вывод на экран через указатели - C++
Учитель задал заполнить массивы и случайными числами и вывезти на экран через указатели, через функцию rand выводит как вы понимаете одни...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2012, 09:41
Привет! Вот еще темы с ответами:

программа сделана через указатели, переделать через ссылки. - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cmath&gt; using namespace std; void calculation(double...

Переписать через указатели - C++
помогите написать эту программу с помощью указателей #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt; using namespace...

массив через указатели - C++
в общем проблемы начинаются с самого начала... нужен массив с Конкретными числами: -6.3, 0.8, 12, -4, 13, 2.5, 7, 8, -9, 10 в...

Массивы через указатели - C++
Задание 1 В упорядоченном по невозрастанию массиве чисел определить, есть ли заданное число A, в противном случае подсчитать сумму чисел,...


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

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

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