25 Haziran 2018 Pazartesi

Streamler std::stringstream Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <sstream> 
Bu sınıf aslında bir typedef. Şöyle tanımlı.
typedef basic_stringstream<char> stringstream;
char yerine başka bir tip ile çalışsın istersek şöyle yaparız.
typedef std::basic_stringstream<char32_t> u32sstream;
stringstream hem bir ostream hem de istream nesnesidir.

Constructor - Default
ostream'e çevrilebilir. Şöyle yaparız.
void log(ostream& o) {
  stringstream* s = dynamic_cast<stringstream*>(&o);
  if (s) {
    cout << s->str() << endl;
  }
}

int main() {
  int x = 5, y = 6;
  log(stringstream() << "x=" << x << ", y=" << y);
  return 0;
}
Constructor - Flags
Şöyle yaparız. Bu durumda ostringstream ile aynı işlevi görür. Binary veri yazma için kullanılır.
stringstream ss (ios_base::out|ios_base::binary);
Constructor - l-value String
İmzası şöyle.
explicit basic_stringstream( const std::basic_string<CharT,Traits,Allocator>& str,
                ios_base::openmode mode = ios_base::in|ios_base::out );
String'den Okuma İşlemi - Bayrak Kullanılmaz
Bu constructor okuma işlemi için kullanılır.
int main()
{
  std::stringstream ss("hello");
  std::string s;
  ss >> s;
  cout << s << endl;
}
s nesnesi hello değerini alır.
int main()
{
  std::stringstream ss("49");
  int x = 0;
  ss >> x;
  cout << x << endl;
}
x nesnesi 49 değerini alır.

String'e Yazma işlemi - Genelde Bayrak Kullanılır
Bayraklar in ve out oldukları için yazma işlemi verilen belleğin başından başlar.
int main() {
  std::stringstream ss("hello");
  ss << " you";
  cout << ss.str() << endl;
}
Çıktı olarak şunu alırız.
youo
Eğer yazma belirtecini sona kaydırırsak
int main() {
  std::stringstream ss("hello");
  ss.seekp(0, ss.end);
  ss << " you!";
  cout << ss.str() << endl;
}
Çıktı olarak şunu alırız.
hello you!
Bunu yapmak yerine aynı şeyi ate bayrağı ile de başarabiliriz.
int main() {
    std::stringstream ss("hello", std::ios_base::out | std::ios_base::ate);
    ss << " you!";
    cout << ss.str() << endl;
}
Çıktı olarak şunu alırız.
hello you!
Constructor - rvalue
Şu anda böyle bir constructor yok. Ancak gelirse imzası şöyle olur.
explicit basic_ostringstream(
   const basic_string<charT, traits, Allocator>&& str,
   ios_base::openmode which = ios_base::out,
   const Allocator& a = Allocator());

Copy Constructor
Açıklaması şöyle
std::stringstream does not have a copy constructor.
clear metodu
Hata bayraklarını temizler. Şöyle yaparız.
stringstream ss;
...
ss.clear();    //clear stream
exceptions metodu
Şöyle yaparız.
std::stringstream ss;
ss.exceptions(std::ios_base::eofbit | std::ios_base::badbit | std::ios_base::failbit);
operator <<
stringstream sınıfı için özel bir << operator metodu yoktur.

read metodu
Şöyle yaparız.
std::vector<char> v = ...;
ss.read(&v[0], v.size());
rdbuf metodu
Şöyle yaparız.
#include <iostream>
#include <sstream>

int main() {
  string work;
  int var1, var2;

  cin >> work.rdbuf();                // Fill from stdin
  stringstream(work) >> var1 >> var2; // Parses as expected.
  cout << var1 << ' ' << var2 << endl;
  return 0;
}
seekp metodu
Yazma konumunu ayarlar. Son karakteri silip başka bir şey yazmak için şöyle yaparız.
std::stringstream str;
str << "["

str.seekp(-1, str.cur); // this is to replace the last character

str<< "]";
str metodu
stream içindeki karakterleri std::string olarak verir.
stringstream ss ;
s << "my string" ;
cout << ss.str() << endl ;
str() metodunun döndürdüğü std::string geçici bir nesnedir. Dolayısıyla aşağıdaki kod dangling pointer hatası yapılmasına sebep olur.
ostringstream o;
o << "some string";
const char* s = o.str().c_str();
str metodu - temizleme
stringstream'i temizleme için str("") metodu çağırılır. clear() metodu ise strem içindeki flag ve kapasiteyi temizler. Şöyle yaparız.
stringstream ss;
s.str ("");
ss.clear();
str metodu
Şu anda böyle bir metod yok. Ancak gelirse imzası şöyle olur.
template<class SAlloc = Allocator>
void str(basic_string<charT, traits, SAlloc>&& s);
write metodu
Şöyle yaparız.
std::vector<char> v = ...;
std::stringstream ss;
ss.write(buffer.data(), buffer.size());
Diğer
getline ile kullanımı
Tüm satırı okuduktan sonra başka bir nümerik tipe çevirmek için kullanılabilir.
string mystr; 
float price=0; 
int quantity=0; 

cout << "Enter price: "; 
getline (cin,mystr); 
stringstream(mystr) >> price; 
cout << "Enter quantity: "; 
getline (cin,mystr); 
stringstream(mystr) >> quantity; 




Hiç yorum yok:

Yorum Gönder