例如:
int main()
{
int out_fd = open("output.txt", O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
int pid = getpid();
if (out_fd != 1) {
write(out_fd, &pid, sizeof(pid));
write(out_fd, "\n", 1);
}
close(out_fd);
}
或者
int out_fd = open("output.txt", O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
float f = 89.2;
if (out_fd != 1) {
write(out_fd, &f, sizeof(f));
write(out_fd, "\n", 1);
}
close(out_fd);
兩者都會產生意想不到的結果(亂碼),例如“ff?B”
雖然兩者都可以方便地解決dprintf(),但是有人可以給我write()系統呼叫版本來將整數/浮點數寫入 fd 嗎?
謝謝!
uj5u.com熱心網友回復:
write只會寫出普通的位元組序列。當你寫出一個“本機”資料型別int,如那)。
您所期望的是寫出的數字的文本表示。因此,您要做的第一件事是將值的二進制表示格式化為文本表示。這正是他們snprintf正在做的事情。獲得文本表示后,您可以使用write.
如果你想在沒有 的情況下做到這一點*printf,那么至少對于整數來說它很容易實作。只需遞回除以數字基數,在每一步寫出除法的余數,直到數字達到零,然后反轉字串。要處理的最大位數也很容易確定:它是log_base(2**bits) = bits · log_base(2) = bits · log(2) / log(base).
#include <stddef.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <math.h>
char *int_to_string(int v, unsigned base)
{
unsigned N_max = sizeof(v)*CHAR_BIT * ceilf(logf(2) / logf(base)) 1;
char *const buf = calloc(1, N_max);
if( !buf ){ return NULL; }
char *digit = buf;
while( v ){
div_t const d = div(v, base);
*digit = ((9 >= d.rem) ? '0' : 'a') d.rem;
if( (v = d.quot) ){ digit; }
}
for(char *tigid = buf; tigid < digit; tigid, --digit ){
char const t = *tigid;
*tigid = *digit;
*digit = t;
}
return buf;
}
int main(int argc, char *argv[])
{
char const *const v = int_to_string(1234567890, 10);
write(0, v, strlen(v));
}
但是,如果您想將浮點值格式化為字串……那么,如何正確地做到這一點仍然是一個活躍的研究領域,您應該研究所謂的“Dragon 演算法”。
write然而,它本身不會為您進行任何資料轉換。它只需要您傳遞給它的地址和長度中存在的任何內容,并將其按原樣發送到檔案中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/523639.html
標籤:Clinux文件描述符
