Giriş
Bu sınıf akımdan okuma yapmayı sağlar. Şu satırı dahil etmek gerekir.
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
Şöyle yaparız.
Elimizde bir ifstream olsun.
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 olsunstd::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));
ÖrnekElimizde 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