我正在努力了解这些功能之间的区别。如果我想一次读一个字符,可以使用其中一个。
fread()
read()
getc()
答案 0 :(得分:3)
根据您的操作方式,您可以使用任何这些功能。
更容易使用可能是fgetc()
。
fread()
:从流中读取数据块(documentation)
read()
:fread()
(documentation)
getc()
:从流(documentation)获取角色。请考虑使用fgetc()
(doc),因为它有点麻烦。
答案 1 :(得分:1)
fread()
是一个标准的C函数,用于从文件中读取二进制数据块。
read()
是一个用于执行此操作的POSIX函数。
getc()
是一个标准的C函数(实际上是一个宏),用于从文件中读取单个字符 - 也就是说,它就是你要找的东西。
答案 2 :(得分:1)
除了其他答案之外,还要注意read
是从文件中读取的无缓冲方法。 fread
提供内部缓冲区并缓冲读取。缓冲区大小由您决定。每次调用read
时,系统调用都会读取您告诉它的字节数。与fread
一样,它将读取内部缓冲区中的块并仅返回您需要的字节。对于fread
上的每个调用,它将首先检查它是否可以从缓冲区提供更多数据,如果不是它进行系统调用(read
)并获得更多数据并返回仅你想要的部分。
另外read
直接处理文件描述符编号,其中fread
需要将文件作为FILE
指针打开。
答案 3 :(得分:0)
答案取决于“一次一个角色”的含义。
如果要确保只从基础文件描述符中消耗一个字符(可能引用不可搜索的对象,如管道,套接字或终端设备),那么唯一的解决方案是使用{{1}长度为1.如果使用read
(或类似)使用shell命令strace
监视shell脚本,您将看到它重复调用read
一个长度1.否则会冒太多字节读取(超过它正在寻找的换行符)并且后续进程无法在“下一行”上看到数据。
另一方面,如果应该执行进一步读取的唯一程序是您的程序本身,read
或fread
将正常工作。请注意,如果您只是读取一个字节,getc
应该很多比getc
快。