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

функция копировки файлов - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
19.12.2009, 23:17     функция копировки файлов #1
написал функцию копировки файлов,и естетвенно не без ошибок!!!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool fileCopy(char firstFile[80],char secondFile[80]){
    FILE* f=fopen(firstFile,"r");
    int c=0;
    int i=0;
    int y=0;
    if((c=getc(f))==NULL){cout<<"File "<<firstFile<<" not found!";
    return 0;
    }
    FILE* f2=fopen(secondFile, "w");
    while(c!='\0'){
    c=(getc(f2));
    i++;
    }
    cout<<"Successful\.";
    return 1;}
вызов
C++
1
2
3
4
5
6
file copy;
    char a[100];
char b[100];
cin.getline(a,100);
cin.getline(b,100);
copy.fileCopy(a,b);
Добавлено через 59 секунд
вот после того как ввожу пути файлов выскакивает окошко с:
Microsoft Visual Studio C Runtime Library has detected a fatal error in proba.exe.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2009, 23:17     функция копировки файлов
Посмотрите здесь:

Написать программу, которая обеспечивает:начальное формирование каталога файлов;вывод каталога файлов;удаление файлов... C++
C++ функция слияния файлов
что за функция такая strstr? или это не функция? C++
какую библиотеку надо подключать чтоб работала функция _getch() и функция cin.get() C++
C++ Рекурсивная функция вывода всех файлов и директорий
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
19.12.2009, 23:32     функция копировки файлов #2
МедведЪ, много недочетов.
Цитата Сообщение от МедведЪ Посмотреть сообщение
C++
1
FILE* f=fopen(firstFile,"r");
Сразу после этой строки можно уже проверить, открылся файл или нет.

Функция fileCopy объявлена возвращающей булево значение, а в ней ты пишешь
Цитата Сообщение от МедведЪ Посмотреть сообщение
C++
1
2
3
4
//...
return 0;
//...
return 1;
Понятно дело что неявно 0 приведется к false, а 1 к true, но зачем лишние преобразования, да и просто нелогично это.
Цитата Сообщение от МедведЪ Посмотреть сообщение
C++
1
bool fileCopy(char firstFile[80],char secondFile[80])
Вместо вот этого можно просто написать
C++
1
bool fileCopy(const char* firstFile,const char* secondFile)
Без лишних указаний размеров.

Код копирования я вообще не наблюдаю.

МедведЪ, как ты изучаешь программирование?
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
19.12.2009, 23:36  [ТС]     функция копировки файлов #3
CyBOSSeR, а как можно копировать?Кодможно посмотреть?

Добавлено через 2 минуты
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
МедведЪ, как ты изучаешь программирование?
жду когда мне к концу года сделают подарок в виде многих книг по С++ и вижуал С++
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
20.12.2009, 00:26     функция копировки файлов #4
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
#include <fcntl.h>                /** для O_CREAT, O_TRUNC                */
#include <errno.h>                /** для errno                                                */
#include <string.h>                /** для strerror()                                */
#include <stdio.h>                /** для fprintf()                                        */
#include <unistd.h>                /** основной хидер                                */
#include <sys/stat.h>        /** для stat(), struct stat        */
 
/** выводит пример использования программы */
void usage(const char* pn) {
        fprintf(stderr, "usage: %s <infile> <outfile>\n", pn);
}
 
/** основная функция */
int main(int argc, const char** argv) {
        if ( argc != 3 ) {
                usage(argv[0]);
                return 0;
        }
 
        /** структура содержащая информацию о файле */
        struct stat st;
        /** заполняем структуру информацией о файле */
        if ( stat(argv[1], &st) ) {
                /** если ошибка - сообщаем, завершаемся */
                fprintf(stderr, "ошибка: %s\n", (errno == ENOENT)?"файла не существует":strerror(errno));
                return errno;
        }
 
        /** открываем исходный файл для чтения */
        int infile = open(argv[1], O_RDONLY);
        if ( -1 == infile ) {
                /** если ошибка - сообщаем, завершаемся */
                fprintf(stderr, "ошибка: %s\n", strerror(errno));
                return errno;
        }
 
        /** создаем результирующий файл */
        int outfile = open(argv[2], O_CREAT|O_TRUNC, st.st_mode);
        if ( -1 == outfile ) {
                /** если ошибка - сообщаем, завершаемся */
                fprintf(stderr, "ошибка: %s\n", strerror(errno));
                close(infile);
                return errno;
        }
 
        /** временный буффер для копирования */
        char buff[BUFSIZ];
        /** кол-во прочитанных байт */
        int rd;
        
        /** цикл, повторяющийся до тех пор, пока не достигнут конец файла */
        /** читаем порцию данных */
        while ( (rd=read(infile, buff, sizeof(buff))) > 0 ) {
                /** записываем */
                write(outfile, buff, rd);
        }
 
        /** закрываем оба файла */
        close(infile);
        close(outfile);
 
        return 0;
}
вот. только что студенту написал))
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.12.2009, 00:26     функция копировки файлов #5
Цитата Сообщение от МедведЪ Посмотреть сообщение
жду когда мне к концу года сделают подарок в виде многих книг по С++ и вижуал С++
Не надо многих, нужна одна хорошая и именно по С++.
Например эта: Э.Кёниг, Б.Му. Эффективное программирование на С++. Практическое программирование на примерах. Серия C++ In-Depth. М. Издательский дом "Вильямс", 2002 г.
Если хочешь я тебе ее скину.
Обязательно выполни и поработай со всеми примерами в книге. Без этого ты далеко не уедешь.
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
20.12.2009, 13:37  [ТС]     функция копировки файлов #6
CyBOSSeR, мне купят книги по С++ и вижуал С++..еще чтобы для чипов программировал

Добавлено через 2 минуты
niXman, мда...спасибо,но что то помньше нет?

Добавлено через 51 секунду
и еще у меня unistd.h не находит
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
20.12.2009, 13:41     функция копировки файлов #7
Цитата Сообщение от МедведЪ Посмотреть сообщение
niXman, мда...спасибо,но что то помньше нет?
как ты мог заметить, в коде нет ничего лишнего. можно немного допилить этот код чтоб использовать как функцию.
так:
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
int copy(const char* src, const char* dst) {
        /** структура содержащая информацию о файле */
        struct stat st;
        /** заполняем структуру информацией о файле */
        if ( stat(src, &st) ) {
                /** если ошибка - сообщаем, завершаемся */
                fprintf(stderr, "ошибка: %s\n", (errno == ENOENT)?"файла не существует":strerror(errno));
                return errno;
        }
 
        /** открываем исходный файл для чтения */
        int infile = open(src, O_RDONLY);
        if ( -1 == infile ) {
                /** если ошибка - сообщаем, завершаемся */
                fprintf(stderr, "ошибка: %s\n", strerror(errno));
                return errno;
        }
 
        /** создаем результирующий файл */
        int outfile = open(dst, O_CREAT|O_TRUNC, st.st_mode);
        if ( -1 == outfile ) {
                /** если ошибка - сообщаем, завершаемся */
                fprintf(stderr, "ошибка: %s\n", strerror(errno));
                close(infile);
                return errno;
        }
 
        /** временный буффер для копирования */
        char buff[BUFSIZ];
        /** кол-во прочитанных байт */
        int rd;
        
        /** цикл, повторяющийся до тех пор, пока не достигнут конец файла */
        /** читаем порцию данных */
        while ( (rd=read(infile, buff, sizeof(buff))) > 0 ) {
                /** записываем */
                write(outfile, buff, rd);
        }
 
        /** закрываем оба файла */
        close(infile);
        close(outfile);
 
        return 0;
}
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
20.12.2009, 13:59  [ТС]     функция копировки файлов #8
niXman, подключил библиотеки что давал выше...но не может найти unistd удалю его тогда
Error 18 error C3861: 'open': identifier not found d:\head-files\alex.h 2352 proba
Error 19 error C3861: 'open': identifier not found d:\head-files\alex.h 2360 proba
Error 20 error C3861: 'close': identifier not found d:\head-files\alex.h 2364 proba
Error 21 error C3861: 'read': identifier not found d:\head-files\alex.h 2375 proba
Error 22 fatal error C1903: unable to recover from previous error(s); stopping compilation d:\head-files\alex.h 2375 proba
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
20.12.2009, 14:16     функция копировки файлов #9
хидеры добавь из первого моего примера.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.12.2009, 16:21     функция копировки файлов #10
МедведЪ, вот тебе пример:
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
#include <iostream>
#include <fstream>
#include <algorithm>
 
enum FileError{
  feOK,                       // Ошибок не обнаружено
  feOpenSourceFileError,      // Не удалось открыть исходный файл    
  feOpenDestinationFileError, // Не удалось открыть результирующий файл
};
 
FileError CopyFile(const char* src_file_name, const char* dst_file_name)
{
  std::ifstream src_file(src_file_name);
 
  // Не забываем проверять открылся ли файл
  if(!src_file)
    return feOpenSourceFileError;
 
  std::ofstream dst_file(dst_file_name);
 
  // Не забываем проверять открылся ли файл
  if(!src_file)
    return feOpenDestinationFileError;
 
  // Отключаем пропуск пробелов и переходов на новую строку
  src_file >> std::noskipws;
 
  // Вот и все копирование
  copy(std::istream_iterator<char>(src_file), std::istream_iterator<char>(), std::ostream_iterator<char>(dst_file));
 
  // Не забываем закрывать файлы
  src_file.close();
  dst_file.close();
 
  return feOK;
}
 
int main()
{
  setlocale(LC_ALL, "Russian");
 
  char src_file_name[260];
 
  std::cout << "Исходный файл: ";
  std::cin >> src_file_name;
 
  char dst_file_name[260];
 
  std::cout << "Результирующий файл: ";
  std::cin >> dst_file_name;
 
  // Пользователю необходимо предоставлять подробности
  // результата работы функции
  switch(CopyFile(src_file_name, dst_file_name)){
    case feOK:
      std::cout << "Копирование прошло успешно" << std::endl;
      break;
 
    case feOpenSourceFileError:
      std::cout << "Не удалось открыть исходный файл" << std::endl;
      break;
 
    case feOpenDestinationFileError:
      std::cout << "Не удалось открыть результирующий файл" << std::endl;
      break;
  }
  
  system("pause");
 
  return 0;
}
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
20.12.2009, 19:26  [ТС]     функция копировки файлов #11
Цитата Сообщение от niXman Посмотреть сообщение
хидеры добавь из первого моего примера
вот я же сказал добавил,только unistd не находит,если удалюя этот файл из кода ты вылетают ошибки

Добавлено через 27 минут
CyBOSSeR, отлично,спасибо большое!!!!!!

Добавлено через 9 минут
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
void CopyFile(const char* src_file_name, const char* dst_file_name)
{
  
    std::ifstream src_file(src_file_name);
 
  // Не забываем проверять открылся ли файл
  if(!src_file)
 cout<<"Не могу найти "<<src_file_name<<endl;
 
  std::ofstream dst_file(dst_file_name);
 
  // Не забываем проверять открылся ли файл
  if(!src_file)
cout<<"Не могу найти "<<dst_file_name<<endl;
 
  // Отключаем пропуск пробелов и переходов на новую строку
  src_file >> std::noskipws;
 
  // Вот и все копирование
  copy(std::istream_iterator<char>(src_file), std::istream_iterator<char>(), std::ostream_iterator<char>(dst_file));
 cout<<"Успешно!";
  // Не забываем закрывать файлы
  src_file.close();
  dst_file.close();
}
вот переделал,сообщения засунул в саму функцию,удалил enum,case...
но не выводится сообщение

Добавлено через 58 секунд
ой ой ойПростите пожалуйста забыл вызвать функию
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.12.2009, 19:31     функция копировки файлов #12
Цитата Сообщение от МедведЪ Посмотреть сообщение
сообщения засунул в саму функцию
МедведЪ, это плохо, функция копирования файла не должна выводить ничего на экран. Что если ты захочешь использовать ее в приложениях c GUI? Там не будет никаких cin/cout. Или тебе надо скопировать 1000 файлов, будет на экране 1000 раз надпись "Успешно"?
Функция должна выполнять только свою задачу (копирование файлов), уведомление пользователя в ее задачу не входит. Она только может с помощью возвращаемого значения проинформировать вызывающую функцию о результате работы.
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
20.12.2009, 19:46  [ТС]     функция копировки файлов #13
CyBOSSeR, мде...у меня что то не получается...мне нужна помощь,надо case поместить в CopyFile

Добавлено через 1 минуту
CyBOSSeR, ладно...убедил,спасибо значит помощь не нужная про 1000 файлов не знал

Не по теме:

а что такое GUI?

niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
20.12.2009, 19:58     функция копировки файлов #14
Цитата Сообщение от МедведЪ Посмотреть сообщение
а что такое GUI?
Graphical User Intrface

Добавлено через 29 секунд
Цитата Сообщение от МедведЪ Посмотреть сообщение
unistd не находит
ну да, код для никсов)
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
20.12.2009, 20:00  [ТС]     функция копировки файлов #15
!!!!!!!!!!!!!!!!!!почему когда адрес второго файла ввожу ПРОВПРО пишет Прошло успешно??!я оменял вот здесь
C++
1
2
3
4
5
6
7
8
 if(!src_file)
    return feOpenSourceFileError;
 
  std::ofstream dst_file(dst_file_name);
 
  // Не забываем проверять открылся ли файл
  if(!dst_file)//здесь ошибки была,было вот это  if(!src_file)
    return feOpenDestinationFileError;
поменял твою ошибку но снова проблемы!проге кажется что адрес второго файла верный...или он вообще не проверяет????
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.12.2009, 20:13     функция копировки файлов #16
Цитата Сообщение от МедведЪ Посмотреть сообщение
проге кажется что адрес второго файла верный...или он вообще не проверяет????
Все правильно, если второго файла не существует, он его создаст сам. Если указывать путь не будешь, файл будет расположен в папке с проектом.
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
20.12.2009, 20:30  [ТС]     функция копировки файлов #17
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Все правильно, если второго файла не существует, он его создаст сам.
как????если так то для чего
C++
1
      std::cout << "Не удалось открыть результирующий файл" << std::endl;
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.12.2009, 20:45     функция копировки файлов #18
У файлов есть атрибут только для чтения.
Так вот файл с таким атрибутом для записи открыть нельзя.
Также у пользователя запустившего программу может не хватать прав для записи.
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
20.12.2009, 21:04  [ТС]     функция копировки файлов #19
CyBOSSeR, значить код правильный?Который я исправил?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2009, 21:09     функция копировки файлов
Еще ссылки по теме:

Обработка файлов. Функция seekg(); C++
C++ Создать производный класс, в котором реализована функция умножения вектора на число и функция сложения двух векторов
Функция удаления текста в скобках [2], непосредственно функция + 12кб вложений C++

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

Или воспользуйтесь поиском по форуму:
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.12.2009, 21:09     функция копировки файлов #20
Цитата Сообщение от МедведЪ Посмотреть сообщение
CyBOSSeR, значить код правильный?Который я исправил?
Программа выполняет свою задачу?
Если да - то код правильный.
Yandex
Объявления
20.12.2009, 21:09     функция копировки файлов
Ответ Создать тему
Опции темы

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