Проблема обработки строк в с++

82
16 января 2022, 22:10

Есть задание на написание программы, которая обрабатывает текстовый файл со строками такого вида:

$GPGSV,3,1,10,27,12,078,41,05,31,308,49,16,25,043,44,02,11,268,44*7E
$GPGSV,3,2,10,26,03,031,39,07,74,216,52,09,58,121,52,30,39,234,48*71
$GPGSV,3,3,10,23,30,116,46,04,37,114,47*79
$GLGSV,2,1,07,84,17,338,43,78,15,212,48,85,12,032,46,67,84,223,53*67
$GLGSV,2,2,07,77,67,195,47,76,50,047,54,66,32,144,52*5C

нужно сначала проверить строку на правильность хэш функции (сложить XOR все символы от $ до * и сравнить их с последними двумя в строчке) потом, если хеш совпадает, то вывести некоторые значения из строки. Я написала отдельно фрагменты программы для проверки хеш функции и вывода значений, отдельно программы работают, но вместе он ничего не выводит. Дебаггер показал, что программа не заходит дальше строчки

k = 0;

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

#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>
#include <numeric>
#include <cstdlib>
#include <cstring>
#include <stdio.h>
int checksum(const char* s){
    int c = 0;
    while (*s)
        c ^= *s++;
    return c;
}

int main() {
    char linec_h[200];
    std::string line, key_s;
    int k, key;
    std::ifstream logs_("C:/Users/Olya/Desktop/broken.txt");
    std::ofstream pout("C:/Users/Olya/Desktop/outLOG.txt");
    if (logs_.is_open()){
        /*int count = 0;
        char buf[256];
        while (logs_.getline(buf, 256))
            count++; */
        for (int i = 0; i < 100; i++) {
            while (getline(logs_, line)){
                key_s = line.substr(line.length() - 2, 2);
                key = strtol(key_s.c_str(), NULL, 16);
                line = line.substr(1, line.length() - 4);
                strcpy_s(linec_h, line.c_str());
                if (key != checksum(linec_h)) pout << "Line is corrupted" << std::endl;
                else {
                    k = 0;
                    if (line.substr(0, 6) == "$GPGSV"){
                        for (size_t i = 0, SNR = 7, N = 4; i < line.size(); i++){
                            if (line[i] == ',') k++;
                            if (k == N){
                                pout << line.substr(i + 1, 2) << " -- Satellite number  ";
                                if ((N += 4) > 16);
                            }
                            else if (k == SNR){
                                pout << line.substr(i + 1, 2) << " -- SNR;" << std::endl;
                                if ((SNR += 4) > 19) break;
                            }
                        }
                    }
                }
                logs_.close();
                std::cout << "Success" << std::endl;
            }
        }
    }
    else std::cout << "File is not open" << '\n';
    pout.close();
    return 0;
}
Answer 1

Проверка не проходит потому, что вот в этой строчке:

line = line.substr(1, line.length() - 4);

вы скопировали строку, начиная со второго символа, т.е. скипнули начальный символ $.

А в проверке if (line.substr(0, 6) == "$GPGSV"){ вы почему-то ожидаете, что этот символ всё ещё есть в строке.

Соответственно, проверку надо исправить на такую:

 if (line.substr(0, 5) == "GPGSV"){
READ ALSO
Несколько auto в объявлении функции

Несколько auto в объявлении функции

Можно объявить функцию так, чтобы узнать возвращаемый тип по типу возвращаемого выражения:

133
Запуск MPI программы без mpiexec/mpirun

Запуск MPI программы без mpiexec/mpirun

Какое поведение следует ожидать при запуске MPI программы без mpiexec/mpirun, но скомпилированной с помощью MPI компилятора? Специфицировано ли оно...

48
Как удалить элемент в линейном списке?

Как удалить элемент в линейном списке?

Создал линейный список и заполнил числами от 0 до 10Как удалить элемент списка, значение которого равно 5? Пожалуйста, подскажите

79
c# - повторное использование подключенных методов

c# - повторное использование подключенных методов

Нужен способ вытаскивать инфу из msi пакетаНашел решение в инете, на его основе сделал класс

155