Сравнение элементов текстового файла между собой - PullRequest
2 голосов
/ 14 января 2020

Я пытаюсь сравнить блоки из трех чисел друг с другом, чтобы создать новый выходной файл только с теми, которые соответствуют этому: первый ди git блока меньше второго и меньше третьего, второй di git в блоке должно быть больше первого, но меньше третьего.

Это мой код для входного файла:

int main()
{
ofstream outfile ("test.txt");
outfile << "123 456 789 123 123 432 \n 123 243 " << endl;

Я хочу разбить это на блоки из трех, такие как «123», «456» и т. д., чтобы иметь возможность записывать только те, которые соответствуют требованию, в новый выходной файл. Я решил преобразовать весь файл в целочисленный вектор, чтобы иметь возможность сравнивать их.

char digit;
ifstream file("test.txt");
vector<int> digits;

 while(file >> digit) {
digits.push_back(digit - '0');
}

, и я полагаю, что метод, который сравнивает их, будет выглядеть примерно так:

bool IsValid(vector<int> digits){
for(int i=0; i<digits.size(); i++){
    if(digits[0] < digits[1] & digits[0] < digits[2] & digits[1]<digits[2])
    return true;

    else{
    return false;
    }
  }
}

Однако это будет просто сравнить первый блок, вы бы сделали по-другому? или я должен продолжать делать векторную идею

Ответы [ 2 ]

0 голосов
/ 14 января 2020

если вы задаете: первое di git блока меньше второго и меньше третьего, второе di git в блоке должно быть больше первого, но меньше третьего - вы num в строковом типе - отсортировано - используйте его)) если данные состоят из 3 цифр и разделены пробелом)))

std :: stringstream ss {line}; - например как фстрим)))

#include <iostream> 
#include <vector> 
#include <iterator>
#include <string>
#include <sstream>
#include <algorithm>


int main() {

    std::string line{"123 456 789 123 123 432 123 243 "};
    std::cout << line << std::endl;

    std::string out_line;

    std::stringstream ss{line};
    std::string tmp_str;

    while(ss >> tmp_str) {
        if (std::is_sorted(std::begin(tmp_str), std::end(tmp_str))) {
            out_line += tmp_str + " ";
        }
    }

    std::cout << out_line << std::endl;

    return 0; 
}
0 голосов
/ 14 января 2020

Вы можете сделать таким образом. Функция «get» считывает один символ, и при наличии 3 цифр вызывается функция IsValid.

#include <fstream>
#include <string>
#include <vector>
using namespace std;

bool IsValid(vector<int> digits)
{
    if(digits[0] < digits[1] & digits[0] < digits[2] & digits[1]<digits[2])
        return true;
    else
        return false;
}
int main()
{
    ifstream in("test.txt");
    ofstream out("output.txt");
    char tmp;
    vector<int> digits;
    while(in.get(tmp))
    {
        if(tmp!=' ' and tmp!='\n')
        {
            digits.push_back(tmp-'0');
            if(digits.size()==3)
            {
                if(IsValid(digits))
                    out<<digits[0]<<digits[1]<<digits[2]<<endl;
                digits.clear();
            }
        }
    }
    out.close();
    in.close();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...