Tumkas
@Tumkas
Ученик, веб программист.

Как при выводе текста из файла C++ запретить заменять Знаки препинания?

5beff1b334413601565377.png
Она должна выводить текст из файла меняя местами каждые два соседних слова.
Вот, что она делает
5beff208af840842807254.png
Как сделать, так чтобы точки и запятые она оставляла (другие знаки препинания тоже, знак вопроса и т.д), а слова меняла и как сделать, так чтобы она считывала слова с новой строчки и меняла местами (на скриншоте видно, что в текстовой файле с новой строчки поставил пробел (если бы его не было, то слово бы не поменялось))
Задача оставлять точки и остальные знаки на своем месте
  • Вопрос задан
  • 356 просмотров
Пригласить эксперта
Ответы на вопрос 1
SerJook
@SerJook
кодер
Можно читать посимвольно и сравнивать каждый символ с разделителями. Складывать токены (найденные слова и разделители) в массив и выводить по мере наполнения в нужном порядке.

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

using namespace std;

int main(int argc, const char * argv[]) {
    ifstream file("file.txt");
    if (!file) {
        std::cout << "Unable to open file" << std::endl;
    }
    string separators = " \t\r\n,.!?;:";
    int i = 0;
    char c;
    bool lastWasSep = true;
    std::string tokens[4];
    std::string curToken;

    while (file.get(c)) {
        bool isSep = separators.find(c) != string::npos;
        if (lastWasSep == isSep) {
            curToken += c;
        } else {
            tokens[i++] = curToken;
            curToken = c;
        }
        lastWasSep = isSep;

        if (i == 4) {
            cout << tokens[0] << tokens[3] << tokens[2] << tokens[1];
            i = 0;
        }
    }
    tokens[i++] = curToken;
    if (i == 4) {
        cout << tokens[0] << tokens[3] << tokens[2] << tokens[1];
    } else {
        for (int j = 0; j < i; j++) {
            cout << tokens[j];
        }
    }

    return 0;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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