Có cách nào để tạo bộ nhớ đệm dưới dạng FILE * hay không. Trong TiXml nó có thể in xml thành một FILE * nhưng tôi không thể làm cho nó in ra một bộ nhớ đệm.Làm cách nào để ghi vào bộ nhớ đệm bằng FILE *?
Trả lời
Bạn có thể sử dụng phương pháp CStr của TiXMLPrinter mà tài liệu khẳng định:
Các TiXmlPrinter rất hữu ích khi bạn cần phải:
- Print để nhớ (đặc biệt là trong chế độ không STL)
- Định dạng điều khiển (kết thúc dòng, v.v.)
Tôi đoán câu trả lời đúng là bởi Kevin. Nhưng đây là một hack để làm điều đó với FILE *. Lưu ý rằng nếu kích thước bộ đệm (ở đây 100000) quá nhỏ thì bạn sẽ mất dữ liệu, vì nó được ghi ra khi bộ đệm bị xóa. Ngoài ra, nếu chương trình gọi fflush() bạn bị mất dữ liệu.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
FILE *f = fopen("/dev/null", "w");
int i;
int written = 0;
char *buf = malloc(100000);
setbuffer(f, buf, 100000);
for (i = 0; i < 1000; i++)
{
written += fprintf(f, "Number %d\n", i);
}
for (i = 0; i < written; i++) {
printf("%c", buf[i]);
}
}
hack dễ dàng - bất kỳ ý tưởng nào nếu nó di động? –
Nó chỉ hoạt động nếu có thể ngăn chặn stdio khỏi xả bộ đệm, và tôi đoán các chi tiết không được chuẩn hóa. –
'setbuf()' và 'setvbuf()' (NOT 'setbuffer()') là ISO-C, vì vậy nó * nên * được di chuyển khi bạn sử dụng chúng. Nếu chế độ đệm được đệm đầy đủ, nó nên cố gắng lấp đầy bộ đệm hoàn toàn; trên cửa sổ, bạn phải sử dụng "NUL" thay vì "/ dev/null"; bạn cũng nên mở tệp ở chế độ nhị phân "wb" – Christoph
fmemopen có thể tạo TẬPTIN từ bộ đệm, bạn có cảm thấy điều đó không?
Tôi đã viết một ví dụ đơn giản làm thế nào tôi sẽ tạo ra một tập tin trong bộ nhớ:
#include <unistd.h>
#include <stdio.h>
int main(){
int p[2]; pipe(p); FILE *f = fdopen(p[1], "w");
if(!fork()){
fprintf(f, "working");
return 0;
}
fclose(f); close(p[1]);
char buff[100]; int len;
while((len=read(p[0], buff, 100))>0)
printf(" from child: '%*s'", len, buff);
puts("");
}
Có một cách POSIX để sử dụng bộ nhớ như một mô tả FILE
: fmemopen
hoặc open_memstream
, tùy thuộc vào ngữ nghĩa bạn muốn: Difference between fmemopen and open_memstream
Không có fmemopen, cũng như open_memstream được định nghĩa trong bất kỳ tiêu chuẩn C/C++ nào! – MFH
@MFH POSIX 200809 – tbert
POSIX KHÔNG phải là tiêu chuẩn C/C++! Đó là một tiêu chuẩn phụ thuộc nhiều vào tiêu chuẩn C, nhưng dù sao chỉ hoạt động trên một tập con của các hệ điều hành được hỗ trợ bởi/phát triển trong C/C++! Chưa kể rằng POSIX xung đột với các khía cạnh nhất định của tiêu chuẩn C/C++ ... – MFH
C++ basic_streambuf
thừa kế
Trong C++, bạn nên tránh FILE*
nếu bạn có thể.
Chỉ sử dụng C++ stdlib, nó có thể để thực hiện một giao diện duy nhất mà minh bạch sử dụng tập tin hoặc bộ nhớ IO.
này sử dụng kỹ thuật đề cập tại địa chỉ: Setting the internal buffer used by a standard stream (pubsetbuf)
#include <cassert>
#include <cstring>
#include <fstream>
#include <iostream>
#include <ostream>
#include <sstream>
/* This can write either to files or memory. */
void write(std::ostream& os) {
os << "abc";
}
template <typename char_type>
struct ostreambuf : public std::basic_streambuf<char_type, std::char_traits<char_type> > {
ostreambuf(char_type* buffer, std::streamsize bufferLength) {
this->setp(buffer, buffer + bufferLength);
}
};
int main() {
/* To memory, in our own externally supplied buffer. */
{
char c[3];
ostreambuf<char> buf(c, sizeof(c));
std::ostream s(&buf);
write(s);
assert(memcmp(c, "abc", sizeof(c)) == 0);
}
/* To memory, but in a hidden buffer. */
{
std::stringstream s;
write(s);
assert(s.str() == "abc");
}
/* To file. */
{
std::ofstream s("a.tmp");
write(s);
s.close();
}
/* I think this is implementation defined.
* pusetbuf calls basic_filebuf::setbuf(). */
{
char c[3];
std::ofstream s;
s.rdbuf()->pubsetbuf(c, sizeof c);
write(s);
s.close();
//assert(memcmp(c, "abc", sizeof(c)) == 0);
}
}
Thật không may, nó dường như không thể trao đổi FILE*
và fstream
: Getting a FILE* from a std::fstream
- 1. Ghi vào bộ nhớ đệm thay vì tệp bằng libjpeg?
- 2. Làm cách nào để kiểm tra nội dung của bộ nhớ đệm Django bằng Python được ghi nhớ?
- 3. Ghi vào bộ đệm khung
- 4. Làm thế nào để làm mới #include file - họ có bộ nhớ đệm trên IIS7/ASP.NET
- 5. FileResult đệm vào bộ nhớ
- 6. Làm thế nào để đệm bộ đệm trong bộ nhớ và ghi nó từ một chủ đề chuyên dụng
- 7. Làm cách nào để tắt bộ nhớ đệm trên Firefox?
- 8. Làm cách nào để ngăn chặn MMAP lưu vào bộ nhớ đệm?
- 9. Cách ghi vào bộ nhớ trong Ext.js
- 10. Làm cách nào để ngăn trình duyệt lưu vào các trường biểu mẫu bộ nhớ đệm?
- 11. Capifony không làm nóng bộ nhớ đệm
- 12. Ghi vào bộ nhớ riêng trong Android
- 13. Làm cách nào để triển khai bộ nhớ đệm ghi đè nền/không đồng bộ trong PHP?
- 14. Có cách nào để xóa bộ đệm ghi SSL
- 15. Làm thế nào để xóa bộ nhớ đệm Sprockets?
- 16. Làm sạch bộ nhớ đệm bằng tiếng tămSau khi ghi đè sự nhầm lẫn
- 17. Làm thế nào để xóa bộ nhớ đệm MKMapView?
- 18. Tôi làm cách nào để thêm bộ nhớ đệm yêu cầu HTTP vào một ứng dụng bằng ASIHTTPRequests?
- 19. NSURLCache không lưu vào bộ nhớ đệm
- 20. trang bộ nhớ đệm bằng cách sử dụng php
- 21. Có thể ghi XML vào bộ nhớ bằng XmlWriter không?
- 22. Bộ nhớ cache, tắt bộ nhớ đệm
- 23. Cách tắt bộ nhớ đệm proxy bằng .htaccess
- 24. Lẫn lộn bộ nhớ đệm Ghi truy vấn Active Rails.cache.fetch
- 25. HTML5 ẩn bộ nhớ đệm
- 26. Làm thế nào để xóa bộ nhớ cache/bộ nhớ đệm in trên MacOSX
- 27. Làm cách nào để ngăn các trình duyệt lưu trong bộ nhớ đệm tập tin CSS?
- 28. Đặt FILE * struct map thành bộ đệm?
- 29. Bộ nhớ đệm mùa xuân so với bộ nhớ đệm
- 30. Xuất bản ghi nhớ đệm trong PHP
Cũng xem [Sự khác nhau giữa fmemopen và open_memstream] (https: // stackoverflow .com/q/29849749/608639). – jww