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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Стоит ли отвыкать от std в коде http://www.cyberforum.ru/cpp-beginners/thread619862.html
подскажите как лучше писать using namespace std; using std::vector; using std::list; using std::string; все писать с std:: в коде если сейчас привыкнуть работать с включенным
C++ Программа для операций над битами Здравствуйте, товарищи программисты! Прошу вас помочь мне с одним делом. В книге есть описание работы с битами. там есть умножение, сложение и т.д. Так вот, я не знаю как написать программу, чтобы проверить работу над битами в числе.Я пытался написать строку из книги, но это сулдя по всему не вся прога. Вот строка: int a, b=3, c=4, a= b & c; http://www.cyberforum.ru/cpp-beginners/thread619857.html
C++ Факторизация методом NFS
у кого есть какие нибудь исходники для факторизации методом решета числового поля? самому что то пока даже доступный алгоритм не найти...
C++ Все нечётные числа заменить нулями
Задан одномерный массив размером в 15 элементов, все нечётные числа заменить нулями
C++ Не могу разобраться в задаче http://www.cyberforum.ru/cpp-beginners/thread619834.html
В командных олимпиадах по программированию для решения предлагается не больше 11 задач. Команда может решать предложенные задачи в любом порядке. Подготовленные решения команда посылает в единую проверяющую систему соревнований. Вам предлагается написать эффективную, в том числе по используемой памяти, программу, которая будет статистически обрабатывать пришедшие запросы, чтобы определить...
C++ std::string -> std::wstring Как перевести данный код в код с использованием wstring ( посути использовать std::vector<std::wstring> refs; ) #include <vector> #include <string> #include <fstream> #include <iterator> std::vector<std::string> refs; std::string file_name="Результат.txt"; std::ofstream ofs1(file_name.c_str()); if(ofs1) подробнее

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

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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 23:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru