Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Программист по неволе
24 / 24 / 8
Регистрация: 22.04.2015
Сообщений: 476
Записей в блоге: 1
1

После копирования файла методом чтения-записи файл копия оказывается поврежденным

12.06.2018, 10:56. Просмотров 922. Ответов 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 <iostream.h>
#include <fstream.h>
#include <sys/stat.h>
 
int sizeOfFile;
struct stat st_one;
 
using namespace std;
 
int main()
{
    cout << "START!" << endl;
    char* filePath = "C:\\Borland\\myPicture.jpg";
    ifstream File (filePath, ios::binary);
    stat(filePath, &st_one);
    sizeOfFile = st_one.st_size;
    char *byteArray = new char[sizeOfFile];
    cout << File <<endl;
    for (int i=0; i<sizeOfFile; i++)    File >> byteArray[i]; //чтение содержимого фала
    
    ofstream newFile;
    newFile.open("C:\\Borland\\MyProjects\\copy\\newPicture.jpg", ios::binary);
    for (int i=0; i<sizeOfFile; i++) newFile << byteArray[i]; //запись содержимого файла
    newFile.close();
    cout << "DONE!" << endl;
    int d;
    cin >> d;
    return 0;
}
Новый файл создается, но при попытке его открыть появляется сообщение, что файл слишком велик или поврежден.
В таком случае, я решил проверить размер а затем и побайтово содержимое каждого из файлов
Вот код программки, которая это делала:
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
#include <iostream.h>
#include <fstream.h>
#include <sys/stat.h>
struct stat st_1;
struct stat st_2;
using namespace std;
 
int main()
{   
    cout << "START!" << endl;
    char* filePath1 = "C:\\Borland\\myPicture.jpg";
    char* filePath2 = "C:\\Borland\\MyProjects\\copy\\newPicture.jpg";
    ifstream File1 (filePath1, ios::binary);
    ifstream File2 (filePath2, ios::binary);
    stat(filePath1, &st_1);
    stat(filePath2, &st_2);
    int sizeOfFile1 = st_1.st_size;
    int sizeOfFile2 = st_2.st_size;
    cout << "Size of 1-st file is " << sizeOfFile1 << endl;
    cout << "Size of 2-nd file is " << sizeOfFile2 << endl;
    char *byteArray1 = new char[sizeOfFile1];
    char *byteArray2 = new char[sizeOfFile2];
    int countOfErrors = 0;
    for (int i=0; i<sizeOfFile1; i++)
    {
        File1 >> byteArray1[i];
        File2 >> byteArray2[i];
        if (byteArray1[i] != byteArray2[i]) 
        {
            cout << "Error in " << i << endl;
            countOfErrors++;
        }
    }
    cout << "The common count of errors is: " << countOfErrors << endl;
    int done;
    cin >> done;
    return 0;
}
как показал результат: размеры файлов одинаковые и каждый байт 1-го фала равен байту второго фала. Число ошибок (несоответствий) показало 0.

Так в чем же таится причина повреждения нового файла?

И да, я знаю что есть функция CopyFile. В данном случае копирование не есть сама цель, лишь некий промежуточный этап.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.06.2018, 10:56
Ответы с готовыми решениями:

Организация записи в файл и чтения атрибутов файла
Доброго времени суток на циферблате Друзья понимаешь!!!! КАК ОРГАНИЗОВАТЬ ЗАПИСЬ В ФАЙЛ И ЧТЕНИЕ...

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

Класс для чтения из файла, записи в файл
Появился вопрос по с++. Создал класс, который может читать и записывать в файл. деструктор класс ...

Какова вероятность, что ровно один файл из двух при записи окажется поврежденным
Два участка жесткого диска имеют размер 90 и 55 Мб, соответственно. На первый участок записывается...

6
6918 / 5983 / 2710
Регистрация: 14.04.2014
Сообщений: 25,504
12.06.2018, 11:02 2
Лучший ответ Сообщение было отмечено Alex_From_777 как решение

Решение

Во-первых, возьми современный компилятор и среду.
Запись/чтение бинарных файлов - write()/read()
1
Продавец времени
4905 / 2681 / 617
Регистрация: 12.03.2015
Сообщений: 12,993
12.06.2018, 12:14 3
Лучший ответ Сообщение было отмечено Alex_From_777 как решение

Решение

Короче, я в С++ не шарю. Покурил мануал по fstream и подрихтовал твой пример. Читай внимательно, я проверил: картинка копируется в идентичный файл.
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
#include <iostream>
#include <fstream>
#include <sys\stat.h>
 
int sizeOfFile;
struct stat st_one;
 
using namespace std;
 
int main()
{
    cout << "START!" << endl;          
    
    //=============== чтение ===================================
    
    ifstream File ("D:\\TEMP\\myPicture.jpg", ios::in | ios::binary | ios::ate);
    if (!File) return -1;
    sizeOfFile = File.tellg();
    cout << "  input file size: " << sizeOfFile << " bytes" << endl;
    File.seekg(0);
    char *byteArray = new char[sizeOfFile];
    File.read(byteArray, sizeOfFile);
    File.close();
    
    //=============== запись ===================================
    
    ofstream newFile ("D:\\TEMP\\newPicture.jpg", ios::binary | ios::trunc);
    if (!newFile) return -1;
    newFile.write(byteArray, sizeOfFile);
    sizeOfFile = newFile.tellp();
    cout << "  copied to new file: " << sizeOfFile << " bytes" << endl;  
    newFile.close();
   
    //=============== финализация ==============================
    cout << "DONE!" << endl;
    delete byteArray; // поюзал память - верни, где взял!
    system("timeout /t 5");
    
    return 0;
}
1
6918 / 5983 / 2710
Регистрация: 14.04.2014
Сообщений: 25,504
12.06.2018, 13:09 4
Verevkin, а где скобки?
C++
1
delete[] byteArray;
1
Продавец времени
4905 / 2681 / 617
Регистрация: 12.03.2015
Сообщений: 12,993
12.06.2018, 13:14 5
После копирования файла методом чтения-записи файл копия оказывается поврежденным


Цитата Сообщение от nmcf Посмотреть сообщение
Verevkin, а где скобки?
Я ж сказал:
Цитата Сообщение от Verevkin Посмотреть сообщение
я в С++ не шарю.
После копирования файла методом чтения-записи файл копия оказывается поврежденным
1
nmcf
12.06.2018, 13:23
  #6

Не по теме:

Цитата Сообщение от Verevkin Посмотреть сообщение
я в С++ не шарю.
А в чём тогда?

0
Verevkin
12.06.2018, 17:46     После копирования файла методом чтения-записи файл копия оказывается поврежденным
  #7

Не по теме:

Цитата Сообщение от nmcf Посмотреть сообщение
А в чём тогда?
Да ни в чём. Дворник я. У меня и компа-то нету.

0
12.06.2018, 17:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2018, 17:46
Привет! Вот еще темы с ответами:

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

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

Драйвер для чтения из файла и записи в файл последних 20 слов
Нужно скопировать последние 20 слов с одного текстового файла в другой За основание берем две...

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


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

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

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