read() & write() 使用无缓冲 I/O。( fd : 整数文件描述符)
fread()和fwrite() 使用缓冲 I/O。(文件*结构指针)
由于字节对齐、可变大小等原因,使用write() 写入 管道的二进制数据可能无法使用fread()读取二进制数据。这是一个废话。
大多数低级设备驱动程序代码使用无缓冲的 I/O 调用。
大多数应用程序级 I/O 使用缓冲。
在逐个机器的基础上使用FILE * 及其相关函数是可以的:但是在其他体系结构上在读写二进制数据时会丢失可移植性。fwrite() 是缓冲 I/O,如果为 64 位架构编写并在 32 位上运行,可能会导致不可靠的结果;或(Windows/Linux)。大多数操作系统在自己的代码中都有兼容性宏来防止这种情况。
对于低级二进制 I/O 可移植性, read()和write()保证在不同架构上编译时相同的二进制读取和写入。基本的事情是在整个二进制套件中选择一种方式并保持一致。
<stdio.h> // mostly FILE* some fd input/output parameters for compatibility
// gives you a lot of helper functions -->
List of Functions
Function Description
───────────────────────────────────────────────────────────────────
clearerr check and reset stream status
fclose close a stream
fdopen stream open functions //( fd argument, returns FILE*) feof check and reset stream status
ferror check and reset stream status
fflush flush a stream
fgetc get next character or word from input stream
fgetpos reposition a stream
fgets get a line from a stream
fileno get file descriptor // (FILE* argument, returns fd)
fopen stream open functions
fprintf formatted output conversion
fpurge flush a stream
fputc output a character or word to a stream
fputs output a line to a stream
fread binary stream input/output
freopen stream open functions
fscanf input format conversion
fseek reposition a stream
fsetpos reposition a stream
ftell reposition a stream
fwrite binary stream input/output
getc get next character or word from input stream
getchar get next character or word from input stream
gets get a line from a stream
getw get next character or word from input stream
mktemp make temporary filename (unique)
perror system error messages
printf formatted output conversion
putc output a character or word to a stream
putchar output a character or word to a stream
puts output a line to a stream
putw output a character or word to a stream
remove remove directory entry
rewind reposition a stream
scanf input format conversion
setbuf stream buffering operations
setbuffer stream buffering operations
setlinebuf stream buffering operations
setvbuf stream buffering operations
sprintf formatted output conversion
sscanf input format conversion
strerror system error messages
sys_errlist system error messages
sys_nerr system error messages
tempnam temporary file routines
tmpfile temporary file routines
tmpnam temporary file routines
ungetc un-get character from input stream
vfprintf formatted output conversion
vfscanf input format conversion
vprintf formatted output conversion
vscanf input format conversion
vsprintf formatted output conversion
vsscanf input format conversion
因此,对于基本用途,我会亲自使用上述内容,而不会过多地混合成语。
相比之下,
<unistd.h> write()
lseek()
close()
pipe()
<sys/types.h>
<sys/stat.h>
<fcntl.h> open()
creat()
fcntl()
all use file descriptors.
这些提供了对读取和写入字节的细粒度控制(推荐用于特殊设备和 fifos(管道))。
再说一次,使用你需要的东西,但在你的习惯用法和界面上保持一致。如果您的大部分代码库都使用一种模式,那么也使用它,除非有真正的理由不这样做。两组 I/O 库函数都非常可靠,每天使用数百万次。
注意——如果您正在将 CI/O 与另一种语言(perl、python、java、c#、lua ...)进行交互,请在编写 C 代码之前查看这些语言的开发人员推荐的内容,这样可以省去一些麻烦。