Как прочитать файл, перевернуть часть текста и записать эту перевернутую часть в другой файл на C ++? - PullRequest
0 голосов
/ 03 мая 2018

Мне нужна помощь, я написал код, сделал обратное, но я не могу написать его в другом файле.

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    ifstream par2("C:/fajllat/f1.bin", ios::in);
    string line;

    for (int i = 1; !par2.eof() ; i++)
    {
        getline(par2, line);

        if (i < 5 || i >14)  continue;
        line = string(line.rbegin(), line.rend());

    }
    par2.close();

    ofstream mbrapsht ("C:/fajllat/f3.bin", ios::out);

    mbrapsht << line;

    mbrapsht.close();
    cin.get();cin.get();

    return 0;
}

Когда я проверяю файлы, файл f3.bin пуст

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

У вас правильная идея. Что вы упускаете, так это то, что если вы хотите написать перевернутые строки, вам нужно либо написать их внутри цикла, либо сохранить их для последующего использования. Вы не делаете ничего из этого.

В настоящее время происходит перезапись line каждого цикла. И то, что осталось в этой строке - это то, что вы пишете потом. Оказывается, для вашего случая это пустая строка.

Давайте внесем минимальные изменения в то, что у вас есть:

// (*) Open the output file before looping
ofstream mbrapsht("C:/fajllat/f3.bin", ios::out);

for (int i = 1; !par2.eof() ; i++)
{
   getline(par2, line);
   if (i < 5 || i > 14)  continue;
   line = string(line.rbegin(), line.rend());

   // (*) output the line - you also probably want an end-of-line
   mbrapsht << line << std::endl;
}

Теперь все в порядке. Но у него есть проблема, когда в случае сбоя getline ваш код по-прежнему выполняет тело цикла еще раз. Это происходит, если getline достигает конца файла (или какого-либо другого состояния ошибки), которое ваш цикл не принимает до следующей итерации (или, возможно, никогда, если ошибка не EOF).

Итак, несколько лучший выбор может быть:

for(int lineNo = 1; std::getline(par2, line); ++lineNo)
{
    if (lineNo >= 5 && lineNo <= 14)
    {
        std::reverse(line.begin(), line.end());  // (*) requires <algorithm>
        mbrapsht << line << std::endl;
    }
}

Обратите внимание, что я также инвертировал ваше условие проверки и удалил continue. В общем, я избегаю циклов continue и break, если их не использовать, в результате получается код, который трудно понять или понять с первого взгляда. Это стиль / ремонтопригодность. Возьми или оставь.

0 голосов
/ 03 мая 2018

Смотрите этот фрагмент. Для построчного обращения вы можете вместо этого использовать getline() и повернуть его перед нажатием vector<string>.

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <algorithm>

using namespace std;
int main()
{
    string str;
    ifstream par2("D:\\MyFolder\\try.txt", ios::in);

    if (par2.is_open())
    {
        stringstream strStream;
        strStream << par2.rdbuf();
        str = strStream.str();
        cout << str << endl;
        par2.close();
    }

    cout << "\n\nReversing ...\n\n";
    std::reverse(str.begin(), str.end());
    cout << str << endl;


    ofstream mbrapsht("D:\\MyFolder\\try2.txt", ios::out);
    mbrapsht << str;
    mbrapsht.close();

    return 0;
}

Выход:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...