Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: teele - 11.10.25 - klo:10.42
-
Jälleen "mielenkiintoinen" c++ strinstream -ongelma. En millään keksi, miksi alla olevassa lyhyessä kokeiluohjelmassa ei koskaan löydetä syötteen lopussa olevia ylimääräisiä merkkejä.
Kolmen kentän arvot (nu ss os) luetaan oikein ja haluttu määrä int arvojakin (j) onnistutaan lukemaan, mutta en koskaan onnistu havaitsemaan ylimääräisiä merkkejä viimeisen j:n jäljessä.
Miksi char-muuttujia lukevaan while-silmukkaan ei koskaan mennä eikä ylimääräinen_merkki saa koskaan luettuja arvoja (näyttäisi, että ääkköset toimivat g++ -kääntäjässä muuttujan nimessä)
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
struct ParsedData
{ int nu;
std::string ss;
std::string os;
std::vector<int> valinnat; // valinnat
};
int j; // valinta intinä
bool string_to_vector(const std::string& syote, ParsedData& tulos)
{ std::stringstream ss(syote);
if(!(ss >> tulos.nu >> tulos.ss >> tulos.os))
{
return false; // Jäsentäminen epäonnistui.
}
std::cout <<tulos.nu << tulos.ss << tulos.os << std::endl;
while(ss >> j)
{
tulos.valinnat.push_back(j);
std::cout << j << std::endl;
}
char ylimääräinen_merkki = 'q'; //ääkköset toimivat muuttujassa myös??? <<===============
//if(ss >> ylimääräinen_merkki)
while(ss >> ylimääräinen_merkki) // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<???????
{ // <<<<<<<<<<<<<<<<<<<< tänne ei päästä koskaan ?????
//return false; // Ylimääräistä dataa löytyi.
std::cout << "yy "; // ei koskaan tulla tänne ??????
}
return true; // Jäsentäminen onnistui ja syöte oli täysin käytetty.
}
// Pääohjelma, joka esittelee funktion käyttöä.
int main(int argc, char *argv[])
{
ParsedData tulos;
if( string_to_vector(argv[1], tulos) )
{ std::cout << "onnistui" << std::endl;
}
else
{ std::cout << "tuli virhe" << std::endl;
}
return 0;
}
/
// g++ kokeilu.cpp -o kokeilu -pedantic
// ./kokeilu '33 ppppp ööö 11 12 oooo'
Muokk. 1
Toisaalta aika tyhmä kysymys. Kun while(ss >> j) eli lukeminen virrasta ei enää onnistu, se ei onnistu myöheminkään while(ss >> ylimääräinen_merkki). Ei auta, vaikka merkki ei ole int.
Toisaalta voisi ajatella, että vaikka int:in lukeminen ei onnistu, char:in lukeminen voisi kuitenkin onnistua.
Millähän keinolla tilanteessa voisi tarkistaa, onko virrassa vielä ylimääräisia merkkejä sen jälkeen, kun viimeisen int:in lukeminen on onnistunut. Ehkä joutuu try -rakenteisiin :(
Muokk. 2
Tekoäly kertoi, että
to test whether a stream has reached the end or encountered a bad character, use the stream status functions such as .eof(), .fail(), .bad(), and .good(). The .eof() function checks if the end of the stream has been reached, .fail() detects input failures (such as reading unexpected characters), and .bad() indicates a serious error that makes the stream unusable.
joten asia varmaan ratkeaa.