0

только начала изучать с++, столкнулась с проблемой вывода символов из строки. Суть в чем: дается файл с данными разделенными запятыми, нужно после определенного к-ва запятых (7, 11, 15, 19) вывести две цифры в другой файл. Я написала часть кода, которая прогоняет строку и считает к-во запятых, но как после выполнения условия нахождения нужного к-ва сразу вывести две цифры ума не приложу. Пробовала через .substr, но это очевидно неправильное решение..

P.S наверное еще неэффективно ищу нужное к-во запятых, наверняка есть элегантное решение увеличения параметра после 7 на 4 и до 19.

#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>



using namespace std;

int main() {
string line; 
float *t0 = NULL; 
int tount = 0;  
int k; 

    ifstream logs_("C:/Users/Olya/Desktop/logGLO.txt"); 
    ofstream tout("outLOGTime.txt"); 
    ofstream pout("outLOGPot.txt"); 
    if (logs_.is_open()) 
    {
        while (!logs_.eof()) 
        {
           k = 0;
            logs_ >> line; 

                /*if(line.substr(0,6) == "$GPGGA")  
                {  

                    if (t0) 
                    {  
                        tout << atof(line.substr(7,10).c_str()) - *t0 << endl;
                    }
                    else 
                    {
                        t0 = new float;

                        *t0 = atof(line.substr(7,10).c_str());
                    }
                    tount++; 
                }*/
                /*else*/ if (line.substr(0,6) == "$GPGSV") 
                {
                    for (size_t i = 0; i < line.size(); i++) 
                        if (line.at(i) == ',') k++; 
                            if(k == 7)

                            {
                                pout << atof(line.substr(0,2).c_str()) << endl; 
                            }

                    for (size_t i = 0; i < line.size(); i++) 
                        if (line.at(i) == ',') k++; 
                            if(k == 11)

                            {
                                pout << atof(line.substr(0,2).c_str()) << endl; 
                            }
                    for (size_t i = 0; i < line.size(); i++) 
                        if (line.at(i) == ',') k++; 
                            if(k == 15)

                            {
                                pout << atof(line.substr(0,2).c_str()) << endl; 
                            }
                    for (size_t i = 0; i < line.size(); i++) 
                        if (line.at(i) == ',') k++; 
                            if(k == 19)

                            {
                                pout << atof(line.substr(0,2).c_str()) << endl; 
                            } 
                }

        logs_.close(); 
        tout << "K-vo Zna4eniy -- " << tount << endl; 
        }
    }
    else 
        cout<<"File is not open"<<'\n';
    tout.close(); 
    pout.close(); 

    return 0;
}
Olya
  • 13

1 Answers1

2

Не вдаваясь, насколько верно то, что вы делаете, эти ваши повторы можно сократить, преобразовав в цикл (как я понимаю, вы спрашивали именно об этом):

for(int N = 7; N <= 19; N+=4)
{

    for (size_t i = 0; i < line.size(); i++)
        if (line.at(i) == ',') k++;
    if(k == N)

    {
        pout << atof(line.substr(0,2).c_str()) << endl;
    }
}

Update

Вот так оно проще...

for (size_t i = 0, N = 7, k=0; i < line.size(); i++)
{
    if (line[i] == ',') k++;
    if(k == N)
    {
        cout << line.substr(i+1,2) << endl;
        if ((N += 4) > 19) break;
    }
}

А вот это

while (!logs_.eof()) 
{
   k = 0;
   logs_ >> line; 

замените на

while(getline(logs_,line))
{
    k = 0;
Harry
  • 221,325
  • Спасибо за сокращение повторов, но основной проблемой для меня является вывод двух символов после определенного к-ва запятых (чем собственно эта часть кода и занимается), я уверена, что ошибочной является "pout << atof(line.substr(0,2).c_str()) << endl;" и если ее переделать, то код будет работать правильно – Olya Dec 13 '19 at 20:16
  • Скажите, у вас между запятыми - ЧТО? по 2 цифры, или может быть ,,2345,34,5555 - ну, разное их число? Ваше * файл с данными разделенными запятыми* включает и полное отсутствие цифр - например, буквы, и что угодно. При таком ТЗ результат один - ХЗ... И еще - проверка while (!logs_.eof()) - неправильная. – Harry Dec 13 '19 at 20:23
  • Вот пример строки: $GPGSV,3,1,10,27,12,078,41,05,31,308,49,16,25,043,44,02,11,268,44*7E

    А почему проверка неправильная?

    – Olya Dec 13 '19 at 20:31
  • https://ru.stackoverflow.com/questions/833980/%d0%9f%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d1%8c%d0%bd%d0%be%d0%b5-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%be%d0%b2%d0%b5%d1%80%d0%ba%d0%b8-%d0%ba%d0%be%d0%bd%d1%86%d0%b0-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0 - это о неправильности eof – Harry Dec 13 '19 at 20:33
  • По второй части - по сути, просто расставьте верно фигурные скобки. Сейчас дополню ответ... – Harry Dec 13 '19 at 20:39
  • Очень красивый и работающий код.. Надеюсь я однажды сама достигну такого уровня решений, но проблема еще сохранилась
    pout << line.substr(0,2) << endl;
    

    По идее она должна выводить в файл значения 41 49 44 44, но она ничего не выводит, основной вопрос состоит в: "Как переделать эту строчку, чтобы он выводил два символа когда выполняется условие"

    – Olya Dec 13 '19 at 20:59
  • Блин! ну да, не 0, а i+1... К вечеру торможу. Посмотрите теперь. Кстати, k=0 я тоже в цикл внес, как внешняя переменная она не нужна. – Harry Dec 13 '19 at 21:02
  • Все еще пустой файл, мне кажется тут сама функция substr неверно использована и вместо нее нужно какую то другую – Olya Dec 13 '19 at 21:06
  • https://ideone.com/ONfqO7 - вот пример, что со строкой работает. У вас сама строка правильно считывается? Вы проверяли? Она имеет нужный формат? Начинается с нужного набора символов? Пройдите в отладчике, посмотрите, где проблема... – Harry Dec 13 '19 at 21:09
  • Какая же я дура, в текстовом файле кроме таких строк ведь есть еще и другие, и, видимо, он увидя первую, отличающуюся от заданной строки просто выходил из программы, а не пробуя другую строку – Olya Dec 13 '19 at 21:16