Есть задание на написание программы, которая обрабатывает текстовый файл со строками такого вида:
$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;
}
Проверка не проходит потому, что вот в этой строчке:
line = line.substr(1, line.length() - 4);
вы скопировали строку, начиная со второго символа, т.е. скипнули начальный символ $
.
А в проверке if (line.substr(0, 6) == "$GPGSV"){
вы почему-то ожидаете, что этот символ всё ещё есть в строке.
Соответственно, проверку надо исправить на такую:
if (line.substr(0, 5) == "GPGSV"){
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Можно объявить функцию так, чтобы узнать возвращаемый тип по типу возвращаемого выражения:
Какое поведение следует ожидать при запуске MPI программы без mpiexec/mpirun, но скомпилированной с помощью MPI компилятора? Специфицировано ли оно...
Создал линейный список и заполнил числами от 0 до 10Как удалить элемент списка, значение которого равно 5? Пожалуйста, подскажите
Нужен способ вытаскивать инфу из msi пакетаНашел решение в инете, на его основе сделал класс