перезапустить программу и stringstream? - PullRequest
0 голосов
/ 27 января 2020

У меня есть эта программа:

#include <iostream>
#include <vector>
#include <math.h>
#include <cstdlib>
#include <iomanip>  
#include <sstream>

using namespace std;




void ProvaErrore() {

    string line, line1;
    char delim = ' ';
    ifstream myfile("DatiMemoria.txt");
    int i = 0, j = 0;
    vector<vector<double>> vettore(40);
    vector<double> risultato;

    while (getline(myfile, line1))
    {
        stringstream ss(line1);
        while (getline(ss, line, delim))
        {
            if (j == 12)
            {
                i++;
                j = 0;
            }
            if (j == 0)
            {
                if (line == 'p')
                {
                    risultato.push_back(0);
                }
                else
                {
                    risultato.push_back(1);
                }
            }
            if (j == 1)
            {
                if (line == 'x')
                {
                    vettore[i].push_back(0);
                }
                else
                {
                    vettore[i].push_back(1);
                }
            }
            if (j == 2)
            {
                if (line == 's')
                {
                    vettore[i].push_back(0);
                    vettore[i].push_back(0);
                }
                if (line == 'y')
                {
                    vettore[i].push_back(0);
                    vettore[i].push_back(1);
                }
                if (line == 'f')
                {
                    vettore[i].push_back(1);
                    vettore[i].push_back(0);
                }
            }
            if (j == 3)
            {
                if (line == 'w')
                {
                    vettore[i].push_back(0);
                }
                if (line == 'n')
                {
                    vettore[i].push_back(1);
                }
            }
            if (j == 4)
            {
                if (line == 't')
                {
                    vettore[i].push_back(0);
                }
                if (line == 'f')
                {
                    vettore[i].push_back(1);
                }
            }
            if (j == 5)
            {
                if (line == 'l')
                {
                    vettore[i].push_back(0);
                    vettore[i].push_back(0);
                }
                if (line == 'p')
                {
                    vettore[i].push_back(0);
                    vettore[i].push_back(1);
                }
                if (line == 'n')
                {
                    vettore[i].push_back(1);
                    vettore[i].push_back(0);
                }
                if (line == 'a')
                {
                    vettore[i].push_back(1);
                    vettore[i].push_back(1);
                }
            }
            if (j == 6)
            {
                if (line == 'b')
                {
                    vettore[i].push_back(0);
                }
                if (line == 'n')
                {
                    vettore[i].push_back(1);
                }
            }
            if (j == 7)
            {
                if (line == 'k')
                {
                    vettore[i].push_back(0);
                    vettore[i].push_back(0);
                }
                if (line == 'w')
                {
                    vettore[i].push_back(0);
                    vettore[i].push_back(1);
                }
                if (line == 'n')
                {
                    vettore[i].push_back(1);
                    vettore[i].push_back(0);
                }
                if (line == 'p')
                {
                    vettore[i].push_back(1);
                    vettore[i].push_back(1);
                }
            }
            if (j == 8)
            {
                if (line == 'c')
                {
                    vettore[i].push_back(0);
                }
                if (line == 'e')
                {
                    vettore[i].push_back(1);
                }
            }
            if (j == 9)
            {
                if (line == 'k')
                {
                    vettore[i].push_back(0);
                }
                if (line == 'n')
                {
                    vettore[i].push_back(1);
                }
            }
            if (j == 10)
            {
                if (line == 's')
                {
                    vettore[i].push_back(0);
                }
                if (line == 'v')
                {
                    vettore[i].push_back(1);
                }
            }
            if (j == 11)
            {
                if (line == 'g')
                {
                    vettore[i].push_back(0);
                }
                if (line == 'u')
                {
                    vettore[i].push_back(1);
                }
            }
            j++;

        }
    }
    for (int i = 0; i < 40; i++)
    {
        for (int j = 0; j < 14; j++)
        {
            cout << vettore[i][j]<<" ";
        }
        cout << "\n";
    }

}

С этим txt-файлом:

e x y w t a b n c n s g
p x s w t p n k e k s g
p x y n t p n k e n v u
p x y w t p n w e k s g
p x s w t p n n e n s g
p x y w t p n w e n s g
p x y w t p n k e n s g
p x y w t p n k e k s g
p x y n t p n p e k v u
e f f n f n n p e n v u
p f y n t p n k e k v u
p x s w t p n w e n s g
p f y n t p n k c n v u
p x y n t p n n e n v u
p x s w t p n k e n s g
p f s n t p n p e k v u
p x y n t p n p e n v u
p x y w t p n n e k s g
p x y n t p n k e k v u
e x f n f n n n e k v u
e x s w t l b k c k s g
e x f n f n n k e n v u
e x y w t l b w c k s g
p f y n t p n p e n v u
e x s w t l b n c n s g
e x y w t a b w c n s g
e x y w t a b k c n s g
e x y w t l b k c k s g
e x f n f n n p e k v u
p x y n t p n n e k v u
e f f n f n n k e k v u
e x s w t l b w c n s g
e f f n f n n k e n v u
e x f n f n n n e n v u
e x s w t a b k c n s g
e f f n f n n p e k v u
e x f n f n n p e n v u
e x y w t l b n c k s g
e x f n f n n k e k v u
p x y w t p n n e n s g

Это простая программа, полезная для анализа данных. У меня есть файл с 40 строками. Каждая строка - это гриб, а каждая колонка - это, например, первая, съедобная или ядовитая. Я хочу прочитать этот файл и преобразовать буквы в цифры (в обычные числа), чтобы поместить их в нейронную сеть. Обычно я делаю это с python, но я хотел попробовать в c ++

При первом запуске все нормально. Но если я пытаюсь запустить его снова, у меня появляется эта ошибка:

error: no matching constructor for initialization of 'std::stringstream' (aka 'basic_stringstream<char, char_traits<char>,
      allocator<char> >')
                stringstream ss(line1);
                             ^  ~~~~~
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.20.27508\include\sstream:531:14: note: candidate constructor not viable: no known conversion from 'std::string' (aka 'basic_string<char, char_traits<char>,
      allocator<char> >') to 'ios_base::openmode' (aka 'int') for 1st argument
    explicit basic_stringstream(ios_base::openmode _Mode = ios_base::in | ios_base::out)
             ^
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.20.27508\include\sstream:539:5: note: candidate constructor not viable: no known conversion from 'std::string' (aka 'basic_string<char, char_traits<char>,
      allocator<char> >') to 'std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >' for 1st
      argument
    basic_stringstream(basic_stringstream&& _Right) : _Mybase(&_Stringbuffer) { // construct by moving _Right
    ^
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.20.27508\include\sstream:562:5: note: candidate constructor not viable: no known conversion from 'std::string' (aka 'basic_string<char, char_traits<char>,
      allocator<char> >') to 'const std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >' for
      1st argument
    basic_stringstream(const basic_stringstream&) = delete;

Почему?

Ответы [ 2 ]

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

Похоже, что вы пытаетесь выполнить ввод-вывод файла, во-первых, разбивая файл на строки и, во-вторых, разбивая каждую строку на пробелы (что, в вашем примере, разбивает их на строки длиной в 1 символ). Вместо этого вы могли бы просто взять l oop на основе диапазона через любой другой символ (тем более что каждая строка имеет одинаковое количество символов). Открытие файла, как показано ниже, позволит вообще не использовать std::stringstream:

std::string current_line;
/* vectors here */
std::ifstream myfile("DatiMemoria.txt");

// You had int j(char_num) = 0, i(line_num) = 0;
// I renamed them to make it clear what they're for
// Also, `char_num` is not initialized until later
unsigned line_num = 0;
if (myfile.is_open())
{
    while (std::getline(myfile, current_line))
    {
        for (int char_num = 0; char_num <= 2 * (12 - 1); char_num += 2)
        {
            // use:
            //     current_line.at(char_num)
            // to get the current character. Then do what you need
            // to with that character. Then, the loop will move to 
            // the next character.
        }
        line_num++;
    }
}

Однако, просто чтобы я не игнорировал ваш вопрос, похоже, ваш компилятор хочет использовать другой конструктор для stringstream чем тот, который принимает в const std::string&. Фактически, если вы посмотрите на свой журнал ошибок, он показывает только 3 возможных конструктора. Вот почему я стараюсь избегать использования stringstream.

. Если вы не можете использовать stringstream, вы можете просто создать поток и затем вставить в него sh строку в два отдельных шага.

std::string str;
std::stringstream sstrm;
sstrm << str;

Или, если строки выдают ошибки,

std::string str;
std::stringstream sstrm;
sstrm << str.c_str();

Я не могу себе представить, чтобы какой-либо здравомыслящий компилятор имел проблему с этим.

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

вы забыли

#include <fstream>

заголовок std::ifstream


 if (line == 'p')

не работает, так как line является std::string. Здесь вы хотите, чтобы

 if (line[0] == 'p')

получил целевой символ. Поэтому замените все line == экземпляров на line[0] ==


В качестве совета попробуйте улучшить качество своего кода. Вы можете достичь этого, погружая свою структуру в разделы и используя функции для выполнения каждой задачи.

также, вы не должны use namespace std;


полный код:

#include <iostream>
#include <vector>
#include <math.h>
#include <cstdlib>
#include <iomanip>  
#include <sstream>
#include <fstream>

using namespace std;


void ProvaErrore() {

    string line, line1;
    char delim = ' ';
    ifstream myfile("DatiMemoria.txt");
    int i = 0, j = 0;
    vector<vector<double>> vettore(40);
    vector<double> risultato;

    while (getline(myfile, line1))
    {
        stringstream ss(line1);
        while (getline(ss, line, delim))
        {
            if (j == 12)
            {
                i++;
                j = 0;
            }
            if (j == 0)
            {
                if (line[0] == 'p')
                {
                    risultato.push_back(0);
                }
                else
                {
                    risultato.push_back(1);
                }
            }
            if (j == 1)
            {
                if (line[0] == 'x')
                {
                    vettore[i].push_back(0);
                }
                else
                {
                    vettore[i].push_back(1);
                }
            }
            if (j == 2)
            {
                if (line[0] == 's')
                {
                    vettore[i].push_back(0);
                    vettore[i].push_back(0);
                }
                if (line[0] == 'y')
                {
                    vettore[i].push_back(0);
                    vettore[i].push_back(1);
                }
                if (line[0] == 'f')
                {
                    vettore[i].push_back(1);
                    vettore[i].push_back(0);
                }
            }
            if (j == 3)
            {
                if (line[0] == 'w')
                {
                    vettore[i].push_back(0);
                }
                if (line[0] == 'n')
                {
                    vettore[i].push_back(1);
                }
            }
            if (j == 4)
            {
                if (line[0] == 't')
                {
                    vettore[i].push_back(0);
                }
                if (line[0] == 'f')
                {
                    vettore[i].push_back(1);
                }
            }
            if (j == 5)
            {
                if (line[0] == 'l')
                {
                    vettore[i].push_back(0);
                    vettore[i].push_back(0);
                }
                if (line[0] == 'p')
                {
                    vettore[i].push_back(0);
                    vettore[i].push_back(1);
                }
                if (line[0] == 'n')
                {
                    vettore[i].push_back(1);
                    vettore[i].push_back(0);
                }
                if (line[0] == 'a')
                {
                    vettore[i].push_back(1);
                    vettore[i].push_back(1);
                }
            }
            if (j == 6)
            {
                if (line[0] == 'b')
                {
                    vettore[i].push_back(0);
                }
                if (line[0] == 'n')
                {
                    vettore[i].push_back(1);
                }
            }
            if (j == 7)
            {
                if (line[0] == 'k')
                {
                    vettore[i].push_back(0);
                    vettore[i].push_back(0);
                }
                if (line[0] == 'w')
                {
                    vettore[i].push_back(0);
                    vettore[i].push_back(1);
                }
                if (line[0] == 'n')
                {
                    vettore[i].push_back(1);
                    vettore[i].push_back(0);
                }
                if (line[0] == 'p')
                {
                    vettore[i].push_back(1);
                    vettore[i].push_back(1);
                }
            }
            if (j == 8)
            {
                if (line[0] == 'c')
                {
                    vettore[i].push_back(0);
                }
                if (line[0] == 'e')
                {
                    vettore[i].push_back(1);
                }
            }
            if (j == 9)
            {
                if (line[0] == 'k')
                {
                    vettore[i].push_back(0);
                }
                if (line[0] == 'n')
                {
                    vettore[i].push_back(1);
                }
            }
            if (j == 10)
            {
                if (line[0] == 's')
                {
                    vettore[i].push_back(0);
                }
                if (line[0] == 'v')
                {
                    vettore[i].push_back(1);
                }
            }
            if (j == 11)
            {
                if (line[0] == 'g')
                {
                    vettore[i].push_back(0);
                }
                if (line[0] == 'u')
                {
                    vettore[i].push_back(1);
                }
            }
            j++;

        }
    }
    for (int i = 0; i < 40; i++)
    {
        for (int j = 0; j < 14; j++)
        {
            cout << vettore[i][j] << " ";
        }
        cout << "\n";
    }
}

вывод:

0 0 1 0 0 1 1 0 1 0 0 1 0 0
0 0 0 0 0 0 1 1 0 0 1 0 0 0
0 0 1 1 0 0 1 1 0 0 1 1 1 1
0 0 1 0 0 0 1 1 0 1 1 0 0 0
0 0 0 0 0 0 1 1 1 0 1 1 0 0
0 0 1 0 0 0 1 1 0 1 1 1 0 0
0 0 1 0 0 0 1 1 0 0 1 1 0 0
0 0 1 0 0 0 1 1 0 0 1 0 0 0
0 0 1 1 0 0 1 1 1 1 1 0 1 1
1 1 0 1 1 1 0 1 1 1 1 1 1 1
1 0 1 1 0 0 1 1 0 0 1 0 1 1
0 0 0 0 0 0 1 1 0 1 1 1 0 0
1 0 1 1 0 0 1 1 0 0 0 1 1 1
0 0 1 1 0 0 1 1 1 0 1 1 1 1
0 0 0 0 0 0 1 1 0 0 1 1 0 0
1 0 0 1 0 0 1 1 1 1 1 0 1 1
0 0 1 1 0 0 1 1 1 1 1 1 1 1
0 0 1 0 0 0 1 1 1 0 1 0 0 0
0 0 1 1 0 0 1 1 0 0 1 0 1 1
0 1 0 1 1 1 0 1 1 0 1 0 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 1 1 1 0 1 0 0 1 1 1 1
0 0 1 0 0 0 0 0 0 1 0 0 0 0
1 0 1 1 0 0 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 1 0 0 1 0 0
0 0 1 0 0 1 1 0 0 1 0 1 0 0
0 0 1 0 0 1 1 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0
0 1 0 1 1 1 0 1 1 1 1 0 1 1
0 0 1 1 0 0 1 1 1 0 1 0 1 1
1 1 0 1 1 1 0 1 0 0 1 0 1 1
0 0 0 0 0 0 0 0 0 1 0 1 0 0
1 1 0 1 1 1 0 1 0 0 1 1 1 1
0 1 0 1 1 1 0 1 1 0 1 1 1 1
0 0 0 0 0 1 1 0 0 0 0 1 0 0
1 1 0 1 1 1 0 1 1 1 1 0 1 1
0 1 0 1 1 1 0 1 1 1 1 1 1 1
0 0 1 0 0 0 0 0 1 0 0 0 0 0
0 1 0 1 1 1 0 1 0 0 1 0 1 1
0 0 1 0 0 0 1 1 1 0 1 1 0 0
...