print2fp(const void *buffer, size_t size, FILE *stream) {
if(fwrite(buffer, 1, size, stream) != size)
return -1;
return 0;
}
Veriler, Dosya akışı yerine dize akışına nasıl yazılır?Dize Akışı C
print2fp(const void *buffer, size_t size, FILE *stream) {
if(fwrite(buffer, 1, size, stream) != size)
return -1;
return 0;
}
Veriler, Dosya akışı yerine dize akışına nasıl yazılır?Dize Akışı C
sadece REFERANS gelen sprintf http://www.cplusplus.com/reference/cstdio/sprintf/
örneği kullanarak:
#include <stdio.h>
int main()
{
char buffer [50];
int n, a=5, b=3;
n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);
printf ("[%s] is a string %d chars long\n",buffer,n);
return 0;
}
Çıkış:
[5 artı 3 8 edilir]
Güncelleme 13 karakter uzunluğunda bir dizge olup: Yorumlardaki önerilere dayanarak: Kullanım snprinft daha güvenli olduğundan (tampon taşma saldırılarını önler) ve taşınabilir.
#include <stdio.h>
int main()
{
int sizeOfBuffer = 50;
char buffer [sizeOfBuffer];
int n, a=5, b=3;
n= snprintf (buffer, sizeOfBuffer, "%d plus %d is %d", a, b, a+b);
printf ("[%s] is a string %d chars long\n",buffer,n);
return 0;
}
Bildirim sen ancak sizeOfBuffer daha düşük bir değere koyabilirsiniz dava için gereksiz olurdu böylece saniye argümanı aslında kullanmak için izin verilen azami boyutu snprintf söyledi. Snprintf yalnızca SizeOfBuffer -1 karakterlerini yazar ve sonlandırma karakteri için son baytı kullanır.
Ve Embbed ve güvenlik bölümü herkesi sinirlendirmeye, burada posix 2008 standardında bir çok düzgün işlevi yoktur http://www.cplusplus.com/reference/cstdio/snprintf/
Sprintf() kullanmayın, sprintf() 'in hemen hemen her kullanımı patlayabilir bazen. Bunun yerine asprintf() işlevini kullanın, sizin için gereken uzunlukta bir arabelleğe malloc olacaktır. Taşınabilir kodda – cmaster
Veya 'snprintf'. Ayrıca, lütfen cplusplus.com'a bağlantı oluşturmayın, bu web sitesi hatalarla dolu. cppreference.com daha iyidir. –
Ayrıca, sprintf ve vsprintf güvenlik endişeleri var. http://www.codecogs.com/library/computing/c/stdio.h/printf.php?alias=snprintf ** "** Sprintf ve vsprintf işlevleri, kötü niyetli kullanıcıların keyfi olarak dinlenmesine olanak verecek şekilde kolayca kötüye kullanılır. Çalışan bir programın işlevselliğini bir arabellek taşması saldırısı yoluyla değiştirme Sprintf ve vsprintf sonsuz uzun bir dizeyi kabul ettiğinden, arayanlar gerçek alanı aşmamaya dikkat etmelidir, bu genellikle temin edilmesi güçtür.Çok için, programcılar snprintf arabirimini kullanmalıdırlar. ** "** – mike
bağlantısıdır: open_memstream(). Böyle kullanabilirsiniz:
char* buffer = NULL;
size_t bufferSize = 0;
FILE* myStream = open_memstream(&buffer, &bufferSize);
fprintf(myStream, "You can output anything to myStream, just as you can with stdout.\n");
myComplexPrintFunction(myStream); //Append something of completely unknown size.
fclose(myStream); //This will set buffer and bufferSize.
printf("I can do anything with the resulting string now. It is: \"%s\"\n", buffer);
free(buffer);
Open_memstream' için iyi bir alternatif var mı? Bir dizi platform (aralarında solaris) bunu sağlamaz [henüz]. –
@BrianVandenberg En yakın, tüm platformlar tarafından sağlanmayan asprintf() 'olacaktır. Diğer tüm alternatifler ya ciddi güvenlik sorunlarına sahiptir, çünkü sağlanan arabelleği ("sprintf()" ve "fmemopen()") taşabilirler ya da önceden ayrılmış arabelleğiniz çok küçük olduğunda (örneğin, önbelleğe alınmış arabellek) hata oluşmasını önlemek için dize neslini iki kez çalıştırmaya zorlarsınız. snprintf() '). Sadece "asprintf()" ve "open_memstream()", güvenli tek geçişli semantik sağlar. Ancak, 'asprintf() 'sizin için çalışacaksa, kendi versiyonunuzu kolayca' vsprintf()' ile gerçekleştirebilirsiniz. – cmaster
Yanıt için teşekkür ederiz. Bir kütüphaneyi taşıyorum, Solaris 'in' open_memstream 'değerini adil bir şekilde kullanması için bir bakıcı değilim ve kodlarını değiştirmekten kaçınmak için özel bir sürüm sunmanın bir yolunu bulmayı umuyordum. Özel bir 'write()/close()' ile kütüphane interpozisyonunu kullanmam gerekebilir (tabii ki libc versiyonlarını çağırmak). –
benim daha önceki soruya benzer: http://stackoverflow.com/questions/1741191/creating-a-file-stream-that-results-in-a-string – Edmund
Senden beri POSIX 2008 dize akış fonksiyonlarına sahip değilsiniz, muhtemelen şansınız kalmaz - bunları sizin amaçlarınız için yeterince iyi simüle eden bir kütüphane bulamadığınız sürece. –
** Dize Akışı **
http://www.gnu.org/s/libc/manual/html_node/String-Streams.html –