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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.67
co6ak
Кошковед
514 / 502 / 30
Регистрация: 12.04.2010
Сообщений: 1,392
#1

Копирование файлов - C++

14.08.2011, 19:51. Просмотров 5001. Ответов 45
Метки нет (Все метки)

Народ, дайте пожалуйста исходник копирования файлов по принципу "открыть файл1 -> считать в буфер содержимое -> открыть файл2 -> заменить содержимое -> сохранить файл2"


очень нужно. зашиваюсь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2011, 19:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Копирование файлов (C++):

Копирование файлов C++ - C++
Прошу помочь найти в чем здесь ошибка. Условие: Дан текстовый файл на русском языке. Скопировать содержимое данного файла в новый...

копирование файлов - C++
Зраствуйте можете подсказать алгоритм копирования файлов любого типу(разширения)??

Копирование файлов - C++
Приветствую. Пытался написать программу для копирования содержимого одного файла в другой: #include <iostream> #include...

копирование файлов - C++
Всем приятного времени суток! Мне нужно просто скопировать файл, вроде ничего сложного) Сделал так: #include <stdio.h> #include...

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

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

45
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
16.08.2011, 15:45 #31
так вродь уже запостили блоками по 512
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
 
    FILE * from = fopen("qt45x.djvu","rb");
    FILE * to = fopen("1.djvu","wb");
 
    char buf[BUFSIZ];
 
    size_t res=0;
 
    while ((res=fread(buf,sizeof(char),BUFSIZ,from))!=0) {
        fwrite(buf,sizeof(char),res,to);
    }
    puts("Succeed.");
 
    return 0;
}
книжку djvu 67 мб без потерь копирнул

Цитата Сообщение от co6ak Посмотреть сообщение
src = fopen(srcName.c_str(), "r");
rb надо открывать. да и зачем мешать std::string к программе на С ?
0
talis
792 / 544 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
16.08.2011, 15:57 #32
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
тут не хватает Dispatch и Translate Messages - чтобі избежать зависания программы при копировании, ну это как рекомендации...


-=ЮрА=-, вы про не-виндоус слышали? Linux, BSD там... Да Макинтош в конце концов. И вообще, зависания не будет, не будет просто вывода. Хотите вывод - делайте полоску прогресса, выносите её в соседний поток (чтобы вывод не тормозил копирование), и будет вам счастье. И вообще, зачем утилите командной строки обрабатывать оконные сообщения?

Цитата Сообщение от co6ak
C
1
2
3
result = fread (buf, 1, file_size, src);
    if (result!=file_size) perror("error");
    fclose(src);
Собак, не копируйте много информации за раз, вам уже говорили. Посмотрите, как это делается тут или постом раньше (-=ЮрА=-).
0
co6ak
Кошковед
514 / 502 / 30
Регистрация: 12.04.2010
Сообщений: 1,392
16.08.2011, 16:03  [ТС] #33
Информация передается во встроенную ф-ию либы libssh, и уже там разбивается по блокам.
проблема была в исполняемых файлах. вЕндуз требует флаг "rb". линух этот флаг игнорирует.

Добавлено через 1 минуту
не могу передавать блоками, т.к. эта сраная либа будет перезаписывать файл, а не добавлять к нему.
0
talis
792 / 544 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
16.08.2011, 16:08 #34
Цитата Сообщение от co6ak Посмотреть сообщение
вЕндуз требует флаг "rb". линух этот флаг игнорирует.
co6ak, не, ну пардон, а я как делал?


Цитата Сообщение от co6ak Посмотреть сообщение
не могу передавать блоками, т.к. эта сраная либа будет перезаписывать файл, а не добавлять к нему.
fopen [reference]

Чтобы открыть с дописыванием, вместо "wb" пишите "ab". И вообще, хотите libssh - юзайте её. Только на том конце создайте сервер/клиент-приёмник, с которым по ssh устанавливайте соединение, и который будет писать выходной файл, и передавайте блоками.

Добавлено через 2 минуты
http://api.libssh.org/master/libssh_tutor_sftp.html
0
co6ak
Кошковед
514 / 502 / 30
Регистрация: 12.04.2010
Сообщений: 1,392
16.08.2011, 16:15  [ТС] #35
как-бэ сказать...
это невозможно.

не потому, что я не умею (а я не умею), а потому, что просто запрещено так делать!!
0
talis
792 / 544 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
16.08.2011, 16:17 #36
co6ak, поймите, это бред - загружать образ диска 7 Гб в оперативку, а потом пересылать это по сетке как есть. Как поставлена задача?
0
co6ak
Кошковед
514 / 502 / 30
Регистрация: 12.04.2010
Сообщений: 1,392
16.08.2011, 16:19  [ТС] #37
неужели я где-то опечатался, и написал "гб" вместо "метров" ?
на коммуникаторе ПЗУ то меньше в 2 раза, какая там нах оперативка.


Задача: написать инсталлятор с минимумом настроект (выбор должностного лица на форме, версия прошивки). подключение - ssh. выполнение команд, заливка файлов, резервное копирование, тестирование, сообщение об ошибках.
0
talis
792 / 544 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
16.08.2011, 16:22 #38
co6ak, тогда понятно Но всё равно, 200 метров - это тоже расточительство. Жалко, что SFTP запрещён. Хорошо бы было.
0
co6ak
Кошковед
514 / 502 / 30
Регистрация: 12.04.2010
Сообщений: 1,392
16.08.2011, 16:23  [ТС] #39
да там максимальный - 8 метров файл. самый большой
0
fasked
16.08.2011, 17:51
  #40
 Комментарий модератора 
Кто продолжит срач на темы переносимости кода или соответствующих разделов форума получит карточку
0
talis
792 / 544 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
16.08.2011, 17:58 #41
co6ak, хорошо, если нельзя SFTP, почему бы не попробовать через SSH примонтировать удалённую директорию с копируемыми файлами через SSHFS, и через SSH же выполнять команды копирования файлов, полагаясь на функционал SSHFS?

Добавлено через 2 минуты
Или SCP? Тоже штука семейства SSH.
0
fasked
Эксперт С++
4963 / 2543 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
16.08.2011, 18:00 #42
Есть мнение, что данный функционал проще выполнить скриптом
А графическая форма (если таковая есть) пусть просто запускает скрипт с параметрами.
0
co6ak
Кошковед
514 / 502 / 30
Регистрация: 12.04.2010
Сообщений: 1,392
17.08.2011, 10:33  [ТС] #43
вся суть, что бы человек толком ни чего не шарящий в перепрошивки этого гамна (как я например ) поставил галочки на уровни прошивки и нажал кнопку.

а проблема была в кривой библиотеке libssh. нормально копирование проходит только побитово
0
Karponter
1 / 1 / 0
Регистрация: 28.06.2012
Сообщений: 14
28.06.2012, 02:12 #44
Здравствуйте! Столкнулся с похожей проблемой: нужно "склеить" содержимое нескольких разнотипных файлов в один так, чтобы потом распаковать их обратно. Уже несколько дней бьюсь над этой проблемой, постоянно натыкаюсь на определенные ошибки. Вот сейчас попробовал способ, описанный выше, а именно - скопировать полностью один из файлов в буфер, потом записать в нужный мне файл. Разные файлы в таком себе "пакете" разделяю тегами.

Вот собственно код:
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
            char th_name[128], th_path[256]={'\0'};
            long int cnt;
            system("cls");
            puts("--<Упаковать тему>--");
            puts("---<Набор файлов>---");
            CallHelp("MainMenu");
 
        // --------- Создаем файл темы ---------
            puts("Введите название темы оформления:");
            scanf("%s",th_name);
 
            if(strcmp(th_name,"#back")==0)                              // проверка на наличие управляющего кода ->
                return 1;                                               // возврата в главное меню.
 
            strcat(strcat(strcat(th_path,"Themes\\"),th_name),".thp");  // генератор пути к файлу
 
            dest_pointer=fopen(th_path,"wb");
            if(dest_pointer==NULL)
            {
                puts("\n\nОшибка открытия файла. Возврат к главному меню.");
                system("pause");
                return 1;
            }
 
        // ---------Работа с файлом explorer.exe---------
            printf("Введите путь к файлу explorer.exe:   ");
            scanf("%s",th_name);
            printf("Выполняется упаковка файла explorer.exe:   ");
            exp_pointer=fopen(th_name,"rb");                // открытие файла explorer.exe
            if(exp_pointer==NULL)                           // проверка на корректность открытия файла
            {
                puts("\n\nОшибка открытия файла. Возврат к главному меню.");
                fclose(dest_pointer);
                system("pause");
                return 1;
            }
            fprintf(dest_pointer,"-<[EXP]");                // внесение в пакет открывающего тега EXP
 
            //--------Копирование---------
            fseek(exp_pointer,0L,SEEK_END);                 // переходим в конец файла
            cnt=ftell(exp_pointer);                         // узнаем длинну файла
            char *buffer=(char*)malloc(cnt*sizeof(char));   // выделяем память для буфера
            fseek(exp_pointer,0,SEEK_SET);                  // переходим в начало файла
 
            if(cnt!=fread(buffer,cnt,1,exp_pointer))        // проверка корректности считываемых данных, сохранение файла в буфер
            {
                puts("\n\nОшибка выделения памяти для буфера. Возврат к главному меню.");
                fclose(dest_pointer);
                fclose(exp_pointer);
                free(buffer);
                system("pause");
                return 1;
            }
            fwrite(buffer,1,cnt,dest_pointer);              // дозапись файла в пакет
 
            fclose(exp_pointer);                            // закрываем файл
            free(buffer);                                   // очистка буфера
            printf("ГОТОВО\n");                             // сигнал
 
 
            fclose(dest_pointer);                           // завершаем пакетный файл темы
            puts("Файл успешно создано. Возврат к главному меню.");
            system("pause");
            return 2;
Проблема в том что всегда выдает ошибку, описанную в этом условии:
C++
1
if(cnt!=fread(buffer,cnt,1,exp_pointer))
В чем может заключаться проблема?
0
alsav22
5431 / 4826 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.06.2012, 07:05 #45
Цитата Сообщение от Karponter Посмотреть сообщение
if(cnt!=fread(buffer,cnt,1,exp_pointer))
В порядке параметров ошиблись. cnt и 1 поменяйте.

Добавлено через 18 минут
fread() возващает количество считанных блоков. Количество блоков - третий параметр.

Добавлено через 13 минут
Если бы проверки не было, то всё бы работало. Наверное, fread() без разницы: 100 блоков по 1 байту, или 1 блок в 100 байтов. Только возвратит при успешном считывании или 100, или 1.
0
28.06.2012, 07:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2012, 07:05
Привет! Вот еще темы с ответами:

Побайтовое копирование файлов - C++
Добрый день. Подскажите пожалуйста,как в данном примере можно было бы выполнить копирование файла в обратном порядке? ifstream...

Написать программу: копирование файлов - C++
Пожалуйста, помогите написать программу, копирующую один файл в другой. Имена файлов программа должна получать из командной строки.Если не...

Копирование файлов через сравнение - C++
Сравнить два каталога разницу записать в третий. В третий каталог нужно положить все файлы, которые есть в первом каталоге , но...

Копирование данных из файлов в файл - C++
Привет, ребята! :) Мне необходимо написать программу, которая открывает потоки для чтения для двух файлов, и поток для записи - для одного....


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

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

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