Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
5 / 5 / 1
Регистрация: 08.05.2011
Сообщений: 121

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

06.07.2012, 09:41. Показов 1788. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.07.2012, 09:41
Ответы с готовыми решениями:

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

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

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.07.2012, 09:41
Помогаю со студенческими работами здесь

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

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

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

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

Перегруженные функции. Через указатели и через ссылки. С++
1. Даны действительные числа a, b и c . Проверить выполняется ли неравенство: a&lt;b&lt;c.если да, то заменить квадратами, иначе заменить модулем...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru