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

Скопировать содержимое одного файла в любое место в другом файле - C++

Восстановить пароль Регистрация
 
WinRar007
 Аватар для WinRar007
1 / 1 / 0
Регистрация: 08.04.2014
Сообщений: 80
04.08.2014, 19:09     Скопировать содержимое одного файла в любое место в другом файле #1
Мне надо скопировать содержимое одного файла в любое место в другом файле.
Пример:
Файл А:

12345
54321
22222

Файл Б:

ааааа
ааааа
ааааа
ббббб
ббббб
ббббб

Копируем в третью строчку.
Итог:

ааааа
ааааа
ааааа
12345
54321
22222
ббббб
ббббб
ббббб



Пока нашёл только нечто вроде:
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
#include <stdio.h>
#include <stdlib.h>
#include <string>;
#include <iostream>;
#include <fstream>;
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    FILE *CLONE;
    FILE *SAVE;
    while (fopen("D:\clone.sfs", "rb") == NULL || fopen("D:\quicksave.sfs", "wb") == NULL)
    {
        cout << "Пожалуйста, положите файл сохранения и файл клона" << endl;
        cout << "в одну папку с данной программой" << endl;
        cout << "Имя файла с клоном должно быть 'CLONE.sfs', а с сохранением - 'quicksave.sfs'" << endl << endl;
        system("pause");
    }
    CLONE = fopen("D:\clone.sfs", "rb");
    SAVE = fopen("D:\quicksave.sfs", "wb");
    char Symb = 'X';
    for (; Symb != 'Y' && Symb != 'y';)
    {
        cout << "Начать клонирование?(Y/N): ";
        cin >> Symb;
        if (Symb == 'N' || Symb == 'n')
        {
            return(0);
        }
    }
    const int size = 256;
    int i = 11;
    char mas[size];
    size_t read;
    while ((read = fread(mas, sizeof(char), size, CLONE)) != 0)
    {
        fwrite(mas, sizeof(char), read, SAVE);
    }
    fclose(CLONE);
    fclose(SAVE);
    return 0;
}
Но оно просто создаёт дубликат первого файла. Мне надо именно:
1) Копировать, не заменяя прошлого содержимого.
2) Копировать только с определённой строчки (Можно и символа, как-нибудь посчитаю).

Можно также спросить, что в этом коде именно стирает всё во втором файле, независимо от его размера, и что такое "size_t read"?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2014, 19:09     Скопировать содержимое одного файла в любое место в другом файле
Посмотрите здесь:

C++ Скопировать содержимое текстового файла, удалив в каждой строке слово номер N+1, если в слове N есть 4
C++ Найти сколько раз содержимое файла 1 встречается в файле 2
C++ Как скопировать из одного файла в другой?
Скопировать данные с одного файла и записать в другой C++
Из одного файла скопировать в другой не удаляя содержимое второго и вывести на экран C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5952 / 5557 / 1787
Регистрация: 18.12.2011
Сообщений: 14,201
Завершенные тесты: 1
04.08.2014, 19:56     Скопировать содержимое одного файла в любое место в другом файле #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Лучше создать третий файл для результата.
И не смешивайте Сишный ввод вывод с потоковым вводом-выводом!
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
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    ifstream  CLONE1("clone1.sfs");
    ifstream  CLONE2("clone2.sfs");
    ofstream  SAVE("quicksave.sfs");
    if(!CLONE1 || !CLONE@ || !SAVE)
    {
        cout << "Пожалуйста, положите файлы клона" << endl;
        cout << "в одну папку с данной программой" << endl;
        cout << "Имя файлов с клоном должно быть CLONE1.sfs и CLONE2.sfs"<< endl;
        system("pause");
        return 0;
    }
    const int size = 256;
    char mas[size];
    for(int i=0;i<3;i++) // копируем первые 3 строки из второго файла
    {
         CLONE2.getline(mas,size);
         SAVE<<mas<<endl;
    }
    for(int i=0;i<3;i++) // копируем 3 строки из первого файла
    {
         CLONE1.getline(mas,size);
         SAVE<<mas<<endl;
    }
    while( CLONE2.getline(mas,size) )// дописываем остаток
           SAVE<<mas<<endl;
    CLONE1.close();
    CLONE1.close();
    SAVE.close();
    return 0;
}
orange_fox
 Аватар для orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
04.08.2014, 20:00     Скопировать содержимое одного файла в любое место в другом файле #3
В файлы дописывать можно только в конец, поэтому пункты 1 и 2 не осуществить.
Алгоритм примерно следующий:
1. Заносим содержимое файла до позиции строчки в переменную 1
2. Заносим содержимое файла после позиции нужной строчки в переменную 2
3. Стираем содержимое файла и записываем в него переменную 1, нужную строчку, переменную 2.

Либо же можно использовать дополнительный файл и сразу записывать в него, не используя переменных 1 и 2.
WinRar007
 Аватар для WinRar007
1 / 1 / 0
Регистрация: 08.04.2014
Сообщений: 80
04.08.2014, 20:12  [ТС]     Скопировать содержимое одного файла в любое место в другом файле #4
zss,
Спасибо большое, добрый человек! Я даже и не знал, что там можно использовать "getline"!
И не смешивайте Сишный ввод вывод с потоковым вводом-выводом!
Код скопипастеный. Но учту!
Mr.X
Эксперт С++
 Аватар для Mr.X
2804 / 1580 / 247
Регистрация: 03.05.2010
Сообщений: 3,680
05.08.2014, 09:11     Скопировать содержимое одного файла в любое место в другом файле #5
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
///////////////////////////////////////////////////////////////////////////////////////////
//Надо скопировать содержимое одного файла в любое место в другом файле.
//Пример:
//Файл А:
//
//12345
//54321
//22222
//
//Файл Б:
//
//ааааа
//ааааа
//ааааа
//ббббб
//ббббб
//ббббб
//
//Копируем в третью строчку.
//Итог:
//
//ааааа
//ааааа
//ааааа
//12345
//54321
//22222
//ббббб
//ббббб
//ббббб
/////////////////////////////////////////////////////////////////////////////////////////
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
/////////////////////////////////////////////////////////////////////////////////////////
T_str   stream_to_string( std::ios   &   stream )
{
    std::ostringstream     sout;
    sout    <<  stream.rdbuf();
    return  sout.str();
}
/////////////////////////////////////////////////////////////////////////////////////////
bool    successfully_try_open_files_with_names
    (
        std::fstream    &   file_first,
        std::fstream    &   file_second,
 
        T_str   const   &   file_name_first,
        T_str   const   &   file_name_second
    )
{
    file_first      .open( file_name_first,     std::ios::in );
    file_second     .open( file_name_second,    std::ios::in );
 
    return      file_first      .is_open()
            &&  file_second     .is_open();
}
/////////////////////////////////////////////////////////////////////////////////////////
void    print_files_names_prompt
    (
        T_str   const   &   file_name_from,
        T_str   const   &   file_name_into
    )
{
    std::cout   << std::endl
                << std::endl
                <<  "Положите файл сохранения и файл клона в одну папку с данной программой."
                << std::endl
                <<  "Имена файлов:"
                << std::endl
                <<  "\tс клоном\t: "
                <<  file_name_from
                << std::endl
                <<  "\tс сохранением\t: "
                <<  file_name_into
                << std::endl;
}
/////////////////////////////////////////////////////////////////////////////////////////
void    save_file_into_file
    (
        std::fstream    &   file_from,
        std::fstream    &   file_into
    )
{
    T_str   file_from_str   =   stream_to_string( file_from  );
    T_str   file_into_str   =   stream_to_string( file_into  );
 
    file_into_str.insert
        (
            file_into_str.size() / 2,
            file_from_str
        );
 
    file_into.close     ();
    file_into.open      ( "save.txt",  std::ios::out );
    file_into   <<  file_into_str;
}
/////////////////////////////////////////////////////////////////////////////////////////
bool    received_command_to_copy_file()
{
    std::cout   << std::endl
                <<  "Начать клонирование?(Y/N): ";
 
    char    const   YES_SYMB        =   'y';
    char            control_symb    =   0;
 
    std::cin    >>  control_symb;
 
    return  tolower( control_symb ) == YES_SYMB;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
 
    T_str   const   FILE_CLONE_NAME     =   "clone.txt";
    T_str   const   FILE_SAVE_NAME      =   "save.txt";
 
    std::fstream   file_clone;
    std::fstream   file_save;
 
    while   (
                !successfully_try_open_files_with_names
                    (
                        file_clone,
                        file_save,
 
                        FILE_CLONE_NAME,
                        FILE_SAVE_NAME
                    )
            )
    {
        print_files_names_prompt
            (
                FILE_CLONE_NAME,
                FILE_SAVE_NAME
            );
 
        system("pause");
    }
 
    if  (
            received_command_to_copy_file()
        )
    {
        save_file_into_file
            (
                file_clone,
                file_save
            );
 
        std::cout   <<  "Клонирование выполнено.";
    }
    else
    {
        std::cout   <<  "Клонирование не выполнено.";
    }
 
    std::cout   <<  std::endl;
    system("pause");
}
Yandex
Объявления
05.08.2014, 09:11     Скопировать содержимое одного файла в любое место в другом файле
Ответ Создать тему
Опции темы

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