Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.72/74: Рейтинг темы: голосов - 74, средняя оценка - 4.72
kraa
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 2
1

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

04.06.2012, 09:26. Просмотров 13783. Ответов 6
Метки нет (Все метки)

Привет всем.
У меня проблема такого рода, пытаюсь скопировать файл, и все вроде получается, за исключением того, что в конец файла добавляется лишний байт. Не могу понять почему, буду рад за помощь.

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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2012, 09:26
Ответы с готовыми решениями:

копирование файла
недавно изучаю С++, собственно столкнулся с проблемой при копировании из одного...

копирование файла
Напишите программу копирования заданного текстового файла в другой текстовый...

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

Копирование файла
Делаю программку для копирование файла настроек оперы с\на разные операционые...

Копирование файла
Задача: Из исходного файла скопировать в новый файл текст таким образом,...

6
ps10n1ck
54 / 48 / 11
Регистрация: 10.11.2010
Сообщений: 132
04.06.2012, 11:27 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));
}
У тебя получается сперва считываются данные, а потом записываются и после происходит проверка на достижение конца файла. Получается считали последний байт, записали его, выполнили проверку - проверка прошла успешно. После опять читаем новый байт и тут получаем конец файла, но дальше стоит запись в файл - пишем этот лишний (последнее значение) байт в файл и только потом идет проверка на достижение конца файла.
0
kraa
0 / 0 / 0
Регистрация: 31.05.2012
Сообщений: 2
04.06.2012, 12:47 3
Спасибо, теперь понял
0
Somebody
2799 / 1610 / 251
Регистрация: 03.12.2007
Сообщений: 4,213
Завершенные тесты: 3
04.06.2012, 13:02 4
А копирование делается намного проще...
C++
1
outfile << infile.rdbuf();
1
MrCold
861 / 759 / 174
Регистрация: 11.01.2012
Сообщений: 1,942
04.06.2012, 13:50 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;
}
0
never old
8 / 8 / 4
Регистрация: 02.06.2012
Сообщений: 25
06.06.2012, 08:33 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;
}
2
casper007
69 / 69 / 58
Регистрация: 12.12.2013
Сообщений: 420
10.01.2015, 16:09 7
never old, хм, код рабочий, но пишет медленно даже если значение len установить больше.
0
10.01.2015, 16:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2015, 16:09

Копирование файла
и если есть, как осуществить копирование нетипизированного файла в С++? вот...

Структуры, копирование файла
Подскажите, как написать программку с меню с пунктами: – посимвольное...

Копирование из файла в файл
ПОМОГИТЕ ПОЖАЛУЙСТА! #include &lt;iostream&gt; #include &lt;fstream&gt; #include...


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

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

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