Bir yürütülebilir dosyayı "pop" ettiğimi varsayalım, bir FILE*
karşılığında. Ayrıca, daha kolay işlem için bu dosyayı bir istream
nesnesine "bağlamayı" isterim, bunu yapmanın bir yolu var mı?FILE * ve istream: ikisini birleştirmek?
8
A
cevap
4
Standart bir yol yoktur, ancak hızlı bir çözüm istiyorsanız dosya tanıtıcısını fileno() ile alabilir ve ardından Josuttis 'fdstream'u kullanabilirsiniz. Etrafta benzer çabalar olabilir ama bunu uzak geçmişte kullandım ve iyi çalıştı. Eğer başka bir şey yoksa, kendi uygulamanız için çok iyi bir harita olmalı.
1
Bir yol var, bir FILE*
dan oluşturulabilir kendi istream
uygulamak.
Bunu yapmak için standart bir yol olup olmadığını soruyorsanız, o zaman hayır.
13
std :: basic_streambuf veya std :: streambuf sınıflarını türeterek uzaklaşabilirsiniz. Bu doğrultuda
şey:
#include <stdio.h>
#include <iostream>
#define BUFFER_SIZE 1024
class popen_streambuf : public std::streambuf {
public:
popen_streambuf() : fp(NULL) {
}
~popen_streambuf() {
close();
}
popen_streambuf *open(const char *command, const char *mode) {
fp = popen(command, mode);
if (fp == NULL)
return NULL;
buffer = new char_type[BUFFER_SIZE];
// It's good to check because exceptions can be disabled
if (buffer == NULL) {
close();
return NULL;
}
setg(buffer, buffer, buffer);
return this;
}
void close() {
if (fp != NULL) {
pclose(fp);
fp = NULL;
}
}
std::streamsize xsgetn(char_type *ptr, std::streamsize n) {
std::streamsize got = showmanyc();
if (n <= got) {
memcpy(ptr, gptr(), n * sizeof(char_type));
gbump(n);
return n;
}
memcpy(ptr, gptr(), got * sizeof(char_type));
gbump(got);
if (traits_type::eof() == underflow()) {
return got;
}
return (got + xsgetn(ptr + got, n - got));
}
int_type underflow() {
if (gptr() == 0) {
return traits_type::eof();
}
if (gptr() < egptr()) {
return traits_type::to_int_type(*gptr());
}
size_t len = fread(eback(), sizeof(char_type), BUFFER_SIZE, fp);
setg(eback(), eback(), eback() + (sizeof(char_type) * len));
if (0 == len) {
return traits_type::eof();
}
return traits_type::to_int_type(*gptr());
}
std::streamsize showmanyc() {
if (gptr() == 0) {
return 0;
}
if (gptr() < egptr()) {
return egptr() - gptr();
}
return 0;
}
private:
FILE *fp;
char_type *buffer;
};
int main(int argc, char *argv)
{
char c;
popen_streambuf sb;
std::istream is(&sb);
if (NULL == sb.open("ls -la", "r")) {
return 1;
}
while (is.read(&c, 1)) {
std::cout << c;
}
return 0;
}
İlgili konular
- 1. Kontrol :: istream
- 2. elle istream C++ 11
- 3. İkisini birden kullanarak: sonra ve: hover
- 4. Her ikisini de al
- 5. C++ çözme istream :: tellg uyarı
- 6. File Ownership Modification productbuild ve pkgbuild tarafından
- 7. Veri birleştirmek ve sınıfları yazmak
- 8. MySQL 3 tabloları birleştirmek ve
- 9. Dosya arasındaki fark nedir: /, file: //, file: ///
- 10. TeamCity'deki eserleri birleştirmek
- 11. SharedPreferences file
- 12. Bir karakter arabelleği için istream olsun?
- 13. Serialize COM varyantı BLOB veya IStream
- 14. boost :: lexical_cast aşırı tanımıyor istream operatörü
- 15. FIFO FILE, Linux ve Mono'ya Yazma (C#)
- 16. WPF - Open File Dialog WPF ve Sunucu
- 17. Ben birleştirmek nasıl aes() ve aes_string() seçenekleri
- 18. Boyut ve çeviri geçişlerini birleştirmek, Safari'de
- 19. React Native File seçici
- 20. Java 8 ile birleştirmek için toplayın
- 21. File.createTempFile() VS new File()
- 22. eclipse.log.level çalışma file not?
- 23. java'da PrintWriter & File
- 24. Ruby'de Canonical File Path
- 25. İki veri çerçevesini birleştirmek
- 26. SPARQL: değişkenleri literallerle birleştirmek
- 27. JQuery birleştirmek nitelik seçiciler
- 28. Sayısal dizilerde değerleri birleştirmek
- 29. birleştirmek ortak WPF Styles
- 30. UDF değerleri birleştirmek için
+1 Oldukça yararlı! Aferin :-) – jweyrich