Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
WinRar007
1 / 1 / 0
Регистрация: 08.04.2014
Сообщений: 80
#1

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

04.08.2014, 19:09. Просмотров 642. Ответов 4
Метки нет (Все метки)

Мне надо скопировать содержимое одного файла в любое место в другом файле.
Пример:
Файл А:

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"?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2014, 19:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Скопировать содержимое одного файла в любое место в другом файле (C++):

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

Из одного файла скопировать в другой не удаляя содержимое второго и вывести на экран - C++
Помогите пожалуйста с задачей, на вид простенькая, но не знаю что делать из одного файла скопировать в другой не удаляя содержимое...

Как скопировать из одного файла в другой? - C++
не понимаю, как копирование можно задать в коде #include &quot;iostream.h&quot; #include &quot;fstream.h&quot; #include &quot;conio.h&quot; int main() { ...

Скопировать данные с одного файла и записать в другой - C++
написать программу которая копирует данные из одного файла в другой лишь те символы чей код больше или рааен 77. помогите написать если...

Скопировать содержимое текстового файла, удалив в каждой строке слово номер N+1, если в слове N есть 4 - C++
Здравствуйте. Помогите, пожалуйста, в написании программы Скопировать содержимое текстового файла, удалив в каждой строке слово номер...

Найти сколько раз содержимое файла 1 встречается в файле 2 - C++
Дано два файла(путь к файлам ввести с консоли).Найти сколько раз содержимое файла 1 встречается в файле 2.

4
zss
Модератор
Эксперт С++
6539 / 6101 / 2010
Регистрация: 18.12.2011
Сообщений: 15,877
Завершенные тесты: 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;
}
1
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.
1
WinRar007
1 / 1 / 0
Регистрация: 08.04.2014
Сообщений: 80
04.08.2014, 20:12  [ТС] #4
zss,
Спасибо большое, добрый человек! Я даже и не знал, что там можно использовать "getline"!
И не смешивайте Сишный ввод вывод с потоковым вводом-выводом!
Код скопипастеный. Но учту!
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
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");
}
0
05.08.2014, 09:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2014, 09:11
Привет! Вот еще темы с ответами:

Как вывести символ в любое место экрана? - C++
Речь идёт о консольной программе. Поиск на форуме в этом отношении ничего не дал. Говорится о формах, о текстовых полях и иных...

Добавление элементов в любое место двухсвязного списка - C++
Есть двухсвязный список, В КОТОРОМ ЕЛЕМЕНТЫ ДОБАВЛЯЮТСЯ В КОНЕЦ. Как сделать что б можно было добавлять элементы в начало и в середину. ...

Скопировать текст из одного файла в другой, добавляя порядковый номер строки и количество символов в ней - C++
Помогите с задачей, пожалуйста!!!:) спасибо заранее! Описать функцию Lines(FileIn, FileOut), которая считывает из входного файла...

Работа с файлами (Скопировать слова из одного текстового файла в другой, расположив их в нем в порядке возрастания длины) - C++
Скопировать слова из одного текстового файла в другой, расположив их в нем в порядке возрастания длины. Помогите пожалуйста с решением.


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

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

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