如果我调用C';s read()多次?

如果我调用C';s read()多次?,c,io,C,Io,文件对此相当含糊。如果我多次调用C的read()函数,我必须传递我希望每次读取的字节数。但是我怎么知道起始索引是什么呢?例如: n=读取(fd,*缓冲区,10) n2=读取(fd,*缓冲区,10) 第一次调用read将使用文件描述符fd将10个字节的文件读取到缓冲区中。但当我再次调用它时,它会读取完全相同的内容,还是会读取接下来的10个字节?我真的不认为这有什么意义,但我看不出有其他方法来定义所需的起始索引。函数read(fd,buf,len)会将fd所引用的文件描述中存储的偏移量提前len。每

文件对此相当含糊。如果我多次调用C的
read()
函数,我必须传递我希望每次读取的字节数。但是我怎么知道起始索引是什么呢?例如:

n=读取(fd,*缓冲区,10)
n2=读取(fd,*缓冲区,10)

第一次调用
read
将使用文件描述符
fd
将10个字节的文件读取到
缓冲区中。但当我再次调用它时,它会读取完全相同的内容,还是会读取接下来的10个字节?我真的不认为这有什么意义,但我看不出有其他方法来定义所需的起始索引。

函数
read(fd,buf,len)
会将
fd
所引用的文件描述中存储的偏移量提前
len
。每次调用
read
write
时,都会在该偏移量处执行操作,之后偏移量会增加。您可以使用
lseek()
手动重新定位偏移量,具体取决于
fd
引用的文件类型

还有一对函数
pread()
pwrite()
不修改此偏移量,而是必须显式地将偏移量传递给函数。请注意,在Linux上,
pwrite()
O\u APPEND
有关

有关更多详细信息,请阅读IEEE 1003.120013版(POSIX.1 2008)中的说明。

函数
read(fd,buf,len)
会将
fd
by
len
引用的文件描述中存储的偏移量提前。每次调用
read
write
时,都会在该偏移量处执行操作,之后偏移量会增加。您可以使用
lseek()
手动重新定位偏移量,具体取决于
fd
引用的文件类型

还有一对函数
pread()
pwrite()
不修改此偏移量,而是必须显式地将偏移量传递给函数。请注意,在Linux上,
pwrite()
O\u APPEND
有关


有关更多详细信息,请阅读IEEE 1003.12013版(POSIX.1 2008)的说明。

操作系统跟踪文件中的“当前位置”。打开文件时,这将是文件的开始。每次调用
read
,您都会从当前位置读取一些字节,并将当前位置提前。您可以使用更改当前位置


请注意,
read
也适用于没有当前位置的对象,如管道和插座。由于从这些文件中读取将始终返回您尚未读取的下一位数据,这使它们与文件的工作方式一致(除了您不能使用
lseek
)。

操作系统会跟踪文件中的“当前位置”。打开文件时,这将是文件的开始。每次调用
read
,您都会从当前位置读取一些字节,并将当前位置提前。您可以使用更改当前位置


请注意,
read
也适用于没有当前位置的对象,如管道和插座。由于从这些文件中读取数据将始终返回您尚未读取的下一位数据,这使它们与文件的工作方式一致(除了您不能使用
lseek
).

@John3136可移植软件不是这样做的。关于这一点的文档非常清楚:文件偏移量随读取的字节数而增加。@fuzzxl您是想告诉我
read()
是否在反复返回相同的字节时不可移植吗?@John3136
read()
可移植(如POSIX中指定的),但是你不能通过尝试正在发生的事情来编写便携软件。在一个平台上以一种方式工作的事情很可能在另一个平台上做其他事情。可移植的方法是查阅相关的文档和标准,找出关于函数行为的可以和不能假设的内容。@John3136例如,Linux中
open()
的大约一半标志是非标准的。如果您认为使用
open()
的代码是可移植的,仅仅因为它在Linux上工作,那么您就被误导了。同样的事情也适用于
read()
,请参阅我链接到的POSIX页面。@John3136这不是便携式软件的工作方式。关于这一点的文档非常清楚:文件偏移量随读取的字节数递增。@fuzzxl您是想告诉我
read()吗
不可移植,无论它是否反复返回相同的字节?@John3136
read()
是可移植的(如POSIX中指定的),但您不能通过尝试正在发生的事情来编写可移植软件。在一个平台上以一种方式工作的事情很可能在另一个平台上做其他事情。可移植的方法是查阅相关的文档和标准,找出关于函数行为的可以和不能假设的内容。@John3136例如,Linux中
open()
的大约一半标志是非标准的。如果您认为使用
open()
的代码是可移植的,仅仅因为它在Linux上工作,那么您就被误导了。同样的事情也适用于
read()
的某些行为,请参阅我链接到的POSIX页面。我以为在Linux中被破坏的是
pwrite()
?你看,我以为是
pwrite()
在Linux中被破坏了?看见