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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 74, средняя оценка - 4.91
kraa
Сообщений: n/a
04.06.2012, 09:26     Копирование файла C++ #1
Привет всем.
У меня проблема такого рода, пытаюсь скопировать файл, и все вроде получается, за исключением того, что в конец файла добавляется лишний байт. Не могу понять почему, буду рад за помощь.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <fstream>
#include <iostream>
 
using namespace std;
 
int main(){
    char * buffer;
    buffer = new char;
 
    ifstream infile("c:\\123.qwe", ios::binary);
    ofstream outfile("c:\\1234.qwe", ios::binary);
    
    while (!infile.eof()){
        infile.read(buffer, sizeof(char));
        outfile.write(buffer, sizeof(char));
    }
 
    delete buffer;
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2012, 09:26     Копирование файла C++
Посмотрите здесь:

C++ Копирование файла
Копирование файла C++
C++ Копирование из оного файла в др.
копирование файла C++
C++ Копирование строк с файла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
04.06.2012, 11:27     Копирование файла C++ #2
Цитата Сообщение от kraa Посмотреть сообщение
C++
1
2
3
4
    while (!infile.eof()){
        infile.read(buffer, sizeof(char));
        outfile.write(buffer, sizeof(char));
    }
замени на
C++
1
2
3
4
5
infile.read(buffer, sizeof(char));
while (!infile.eof()){
    outfile.write(buffer, sizeof(char));
    infile.read(buffer, sizeof(char));
}
У тебя получается сперва считываются данные, а потом записываются и после происходит проверка на достижение конца файла. Получается считали последний байт, записали его, выполнили проверку - проверка прошла успешно. После опять читаем новый байт и тут получаем конец файла, но дальше стоит запись в файл - пишем этот лишний (последнее значение) байт в файл и только потом идет проверка на достижение конца файла.
kraa
Сообщений: n/a
04.06.2012, 12:47     Копирование файла C++ #3
Спасибо, теперь понял
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
04.06.2012, 13:02     Копирование файла C++ #4
А копирование делается намного проще...
C++
1
outfile << infile.rdbuf();
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
04.06.2012, 13:50     Копирование файла C++ #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <fstream>
using namespace std;
 
int main () {
  int len;
  char * buffer;
 
  ifstream  infile("c:\\123.qwe", ios::binary);
  ofstream outfile("c:\\1234.qwe", ios::binary);
 
  infile.seekg (0, ios::end);
  len = infile.tellg();
  infile.seekg (0, ios::beg);
  buffer = new char [len];
 
  infile.read   (buffer,len);
  outfile.write (buffer,len);
 
  delete[] buffer;
  return 0;
}
never old
8 / 8 / 1
Регистрация: 02.06.2012
Сообщений: 25
06.06.2012, 08:33     Копирование файла C++ #6
В предыдущем примере большим файлом можно и память скушать

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
#include <fstream>
#include <iostream>
 
using namespace std;
 
int main(){
    char * buffer;
    int len = 4096; //Выбираем размер буфера, какой нравится
 
    ifstream infile("c:\\123.qwe", ios::in | ios::binary);
    ofstream outfile("c:\\1234.qwe", ios::out | ios::binary);
    if(!infile || !outfile){ //ошибку открытия файлов стоит отслеживать, всякое бывает
        cout << "Oops...\n";
        return 1;
    }
 
    buffer = new char[len];
    while (!infile.eof()){
        infile.read(buffer, len);
        if(infile.gcount()) outfile.write(buffer, infile.gcount());
        //gcount возвращает количество байт, считанных в последний раз
        //ее и используем для проверки, что что-то считалось, а заодно устанавливаем количество записываемых байт
    }
 
    infile.close();
    outfile.close(); //позакрывали файлы
    delete[] buffer;
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2015, 16:09     Копирование файла C++
Еще ссылки по теме:

C++ копирование файла
C++ Структуры, копирование файла
C++ Копирование файла C++

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

Или воспользуйтесь поиском по форуму:
casper007
61 / 61 / 21
Регистрация: 12.12.2013
Сообщений: 375
10.01.2015, 16:09     Копирование файла C++ #7
never old, хм, код рабочий, но пишет медленно даже если значение len установить больше.
Yandex
Объявления
10.01.2015, 16:09     Копирование файла C++
Ответ Создать тему
Опции темы

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