Задать вопрос
caramel14
@caramel14
Всякое разное этакое чажу

Запись из одного текстового файла в другой не работает. Что делать?

По идее, программа должна посимвольно сравнивать содержание двух текстовых файлов (txt1 и txt2) и одинаковые элементы записывать в третий текстовый файл(txt3).

#include <iostream>
#include <fstream>
#include <string>
int main(){
//переменные, отвечающие за посимвольный перебор//
    char sim1, sim2,n;
//строки, на которые мы ориентируемся//
    std::string line;
    std::string line2;
//открытие двух материнских файлов для чтения//
    std::ifstream txt1("txt.txt");
    std::ifstream txt2("txt2.txt");
    if (txt1.is_open())
    {
        if (txt2.is_open())
            {
            std::cout<<"Файлы txt1 и txt2 открыты"<<std::endl;
//посимвольно сравниваем два файла//
            while (txt1.get(sim1),feof)
                while (txt2.get(sim2),feof)
//одинаковые элементы записываем в третий//
                    if (sim1==sim2) {
                        std::ofstream txt3("txt3.txt");
                        std::cout<<sim1;
                        txt3.close();}              
            }
    }
//закрываем файлы//
    txt1.close();
    txt2.close();
    std::cout << "End of program" << std::endl;
    return 0;

};


Программа выводит только строчку что оба файла открыты. Что я делаю не так?
  • Вопрос задан
  • 236 просмотров
Подписаться 2 Простой 3 комментария
Решения вопроса 1
#include <iostream>
#include <fstream>

int main() {

    // переменные, отвечающие за посимвольный перебор
    char sim1, sim2, n;

    // abbreviation: not identical
    bool ni = false;

    // открытие двух материнских файлов для чтения
    std::ifstream txt1("txt1.txt");
    std::ifstream txt2("txt2.txt");

    // открытие файла для записи
    std::ofstream txt3("txt3.txt");

    if (!txt1.is_open() || !txt2.is_open()) {
        std::cout << "I can't open a file for reading" << std::endl;

        return 1;
    }

    if(!txt3.is_open()) {
        std::cout << "I can't open a file for writing" << std::endl;

        return 1;
    }

    std::cout << "txt1 and txt2 files are open" << std::endl;

    // посимвольное сравниваем два файла
    while(!txt1.eof() && !txt2.eof()) {

        txt1.get(sim1);
        txt2.get(sim2);

        if(sim1 == sim2) {
            txt3.put(sim1);
        } else {
            ni = true;
        }
    }

    if(!ni && txt1.eof() && txt2.eof()) {
        // сообщение о успехе
        std::cout << "The file contents are identical" << std::endl;
    } else {
		// Если посимвольное сравнение не увенчалось успехом
        std::cout << "The contents of the files are not identical" << std::endl;
	}

    // закрываем файлы
    txt1.close();
    txt2.close();
    txt3.close();

    std::cout << "End of program" << std::endl;

    return 0;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Chronicler
@Chronicler
Программист
Что я делаю не так?

Не читаете документацию к используемым абстракциям.
У вас в цикле, на каждой итерации вот здесь затирается и заново открывается на запись файл txt3.txt
if (sim1==sim2) {
  std::ofstream txt3("txt3.txt");
  std::cout<<sim1;
  txt3.close();}              
}

Вам нужно один раз открыть его там же где открываете файлы на чтение. По умолчанию при создании std::ofstream, стирается все что есть в файле и новые данные заново записываются.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы