Bất cứ ai có thể giải thích tại đơn giản bằng tiếng Anh về sự khác biệt giữa printf
, fprintf
và sprintf
với các ví dụ?
Nó nằm trong luồng nào?
Tôi thực sự bối rối giữa ba điều này trong khi đọc về "Xử lý tệp trong C".
Bất cứ ai có thể giải thích tại đơn giản bằng tiếng Anh về sự khác biệt giữa printf
, fprintf
và sprintf
với các ví dụ?
Nó nằm trong luồng nào?
Tôi thực sự bối rối giữa ba điều này trong khi đọc về "Xử lý tệp trong C".
Câu trả lời:
Trong C, một "luồng" là một sự trừu tượng; từ quan điểm của chương trình, nó chỉ đơn giản là một nhà sản xuất (luồng đầu vào) hoặc người tiêu dùng (luồng đầu ra) của byte. Nó có thể tương ứng với một tệp trên đĩa, với đường ống, đến thiết bị đầu cuối của bạn hoặc với một số thiết bị khác như máy in hoặc tty. Các FILE
loại chứa thông tin về các dòng suối. Thông thường, bạn không gây rối FILE
trực tiếp với nội dung của một đối tượng, bạn chỉ cần chuyển một con trỏ tới nó cho các thói quen I / O khác nhau.
Có ba luồng tiêu chuẩn: stdin
là một con trỏ tới luồng đầu vào tiêu chuẩn, stdout
là một con trỏ tới luồng đầu ra tiêu chuẩn và stderr
là một con trỏ tới luồng đầu ra lỗi tiêu chuẩn. Trong phiên tương tác, cả ba thường đề cập đến bảng điều khiển của bạn, mặc dù bạn có thể chuyển hướng chúng để trỏ đến các tệp hoặc thiết bị khác:
$ myprog < inputfile.dat > output.txt 2> errors.txt
Trong ví dụ này, stdin
bây giờ trỏ đến inputfile.dat
, stdout
trỏ đến output.txt
và stderr
trỏ đến errors.txt
.
fprintf
ghi văn bản được định dạng vào luồng đầu ra mà bạn chỉ định.
printf
tương đương với việc viết fprintf(stdout, ...)
và ghi văn bản có định dạng vào bất cứ nơi nào luồng đầu ra tiêu chuẩn hiện đang trỏ.
sprintf
ghi văn bản có định dạng vào một mảng char
, trái ngược với luồng.
printf
đầu ra cho luồng đầu ra tiêu chuẩn ( stdout
)
fprintf
đi đến một tập tin xử lý ( FILE*
)
sprintf
đi đến một bộ đệm bạn đã phân bổ. ( char*
)
printf ("format", args) được sử dụng để in dữ liệu lên đầu ra tiêu chuẩn thường là màn hình máy tính.
sprintf (char *, "format", args) giống như printf. Thay vào đó, hiển thị chuỗi được định dạng trên đầu ra tiêu chuẩn, tức là một màn hình, nó lưu trữ dữ liệu được định dạng trong một chuỗi được trỏ bởi con trỏ char (tham số đầu tiên). Vị trí chuỗi là sự khác biệt duy nhất giữa printf và cú pháp chạy nước rút.
fprintf (FILE * fp, "format", args) giống như printf một lần nữa. Ở đây thay vì hiển thị dữ liệu trên màn hình hoặc lưu nó trong một số chuỗi, dữ liệu được tạo sẽ được lưu trên một tệp được trỏ bởi con trỏ tệp được sử dụng làm tham số đầu tiên cho fprintf. Con trỏ tệp là sự bổ sung duy nhất cho cú pháp của printf.
Nếu tệp xuất chuẩn được sử dụng làm tham số đầu tiên trong fprintf, thì hoạt động của nó được coi là tương đương với tham số của printf.
printf(...)
tương đương với fprintf(stdout,...)
.
fprintf
được sử dụng để xuất ra luồng.
sprintf(buffer,...)
được sử dụng để định dạng một chuỗi thành một bộ đệm.
Lưu ý là cũng có vsprintf
, vfprintf
vàvprintf
v
hương vị không theo tiêu chuẩn tôi tin
v
hương vị rất chắc chắn trong tiêu chuẩn C.
Bạn cũng có thể làm những việc rất hữu ích với hàm vsnprintf ():
$ cat test.cc
#include <exception>
#include <stdarg.h>
#include <stdio.h>
struct exception_fmt : std::exception
{
exception_fmt(char const* fmt, ...) __attribute__ ((format(printf,2,3)));
char const* what() const throw() { return msg_; }
char msg_[0x800];
};
exception_fmt::exception_fmt(char const* fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vsnprintf(msg_, sizeof msg_, fmt, ap);
va_end(ap);
}
int main(int ac, char** av)
{
throw exception_fmt("%s: bad number of arguments %d", *av, ac);
}
$ g++ -Wall -o test test.cc
$ ./test
terminate called after throwing an instance of 'exception_fmt'
what(): ./test: bad number of arguments 1
Aborted (core dumped)
vsnprintf
là một hàm không chuẩn. Hầu hết các triển khai tôi đã thấy thực hiện điều này hoặc một cái gì đó tương tự, nhưng nó là cụ thể thực hiện.
in
printf("control string ", argument );
fprintf
fprintf (filename, "control string ", argument );
sprintf: Ghi dữ liệu được định dạng vào chuỗi ký tự trong bộ nhớ thay vì thiết bị xuất chuẩn
Cú pháp của sprintf là:
#include <stdio.h>
int sprintf (char *string, const char *format
[,item [,item]…]);
Đây,
Chuỗi tham chiếu đến con trỏ tới bộ đệm trong bộ nhớ trong đó dữ liệu sẽ được ghi.
Định dạng đề cập đến con trỏ đến một chuỗi ký tự xác định định dạng.
Mỗi mục là một biến hoặc biểu thức chỉ định dữ liệu cần ghi.
Giá trị được trả về bởi sprintf lớn hơn hoặc bằng 0 nếu thao tác thành công hoặc nói cách khác, số ký tự được viết, không tính ký tự null kết thúc được trả về và trả về giá trị nhỏ hơn 0 nếu xảy ra lỗi.
printf: In ra thiết bị xuất chuẩn
Cú pháp cho printf là:
printf format [argument]…
Sự khác biệt duy nhất giữa sprintf () và printf () là sprintf () ghi dữ liệu vào một mảng ký tự, trong khi printf () ghi dữ liệu vào thiết bị xuất chuẩn, thiết bị đầu ra tiêu chuẩn.