20 Ekim 2017 Cuma

std::istream_iterator Sınıfı

Giriş
Bu sınıf  akımdan okuma yapmayı sağlar. Şu satırı dahil etmek gerekir.
#include <iterator>
Genel Kullanım 
1. İki tane istream_iterator oluşturarak veri yapısı doldurulur.
2. İki tane istream_iterator oluşturarak std::copy + inserter benzeri bir algoritma kullanılır.

istreambuf_iterator İle Farkı
istreambuf_iterator whitespace gibi karakterleri atlamaz ve okur. istream_iterator ise okumaz.

Constructor - istream
Belirtilen istream nesnesini okunur.

Örnek - kelimelere ayırmak
Elimizde şöyle bir istringstream olsun
string sentence = "And I feel fine...";
istringstream iss(sentence);
Bu string'i kelimelere şöyle ayırırız.
vector<string> tokens;
copy(istream_iterator<string>(iss),
     istream_iterator<string>(),
     back_inserter(tokens));
Örnek - kelimelere ayırmak
Şöyle yaparız.
stringstream ss (sentence);
for (auto w = istream_iterator<string>(ss) ; w != istream_iterator<string>() ; w++) {
  string &word = *w;
  ...
}
Örnek - double okumak
Elimizde bir ifstream olsun
std::string file_name = ...;
std::ifstream afile (file_name);
Stream'deki her double değeri bir vector'e okumak için şöyle yaparız.
std::vector<double> x;

std::copy(std::istream_iterator<double>(afile), std::istream_iterator<double>(),
  std::back_inserter(x));
Örnek
Elimizde bir ifstream olsun.
std::ifstream afile(somefile);
noskipws(afile);
...
std::vector<uint_8> vOfBytes = { std::istream_iterator<uint8_t>(afile),
                                 std::istream_iterator<uint8_t>() };
istream_iterator >> operatörü ile stream'den karakter okur. >> operatörü default olarak whitespace'i atlar. Atlamasın diye noskipws yapıyoruz. Eğer bunu yapmasaydık dosyayı binary açsak bile okunan byte sayısı ile dosya büyüklüğünün farklı olduğunu görecektik. Aşağıdaki kod parçasında bu fark görülebilir.
std::string filename = ...;

// Get file size
std::ifstream ifs(filename, std::ios::binary | std::ios::ate);
int size = (int)ifs.tellg();
std::cout << "Detected " << filename << " size: " << size << std::endl;

// Load file
ifs.seekg(0, std::ios::beg);
std::istream_iterator<char unsigned> start(ifs), end;
std::vector<char unsigned> v;
v.reserve(size);
v.assign(start, end);

std::cout v.size() << " elements" << std::endl;
Çıktı olarak şunu alırız.
Detected foo_binary.bin size: 2113753
Loaded data from foo_binary.bin, with 2099650 elements


Hiç yorum yok:

Yorum Gönder