Positional Reads and Writes
位置读写,代替lseek(),但不会更新当前文件指针的位置。
#define _XOPEN_SOURCE 500
#include <unistd.h>
ssize_t pread(int fd, void *buf, size_t count, off_t pos);
ssize_t pwrite(int fd, void *buf, size_t count, off_t pos);
任何混合的read()和write()调用都会更新当前文件指针的位置。
这两个函数与read(), write(), lseek()的联合使用有三个不同点:
- 这些调用更容易使用,特别是在执行棘手的操作时,例如向后或随机地遍历文件。
- 在完成后,它们不会更新文件指针。
- 它们避免使用lseek()时可能发生的任何潜在竞争。(原子操作,多线程情况下可以避免竞争)。
Truncating Files
#include <unistd.h>
#include <sys/types.h>
int ftruncate(int fd, off_t len);
int truncate(const char *path, off_t len);
这些系统调用最常用的方法是将文件截断到小于其当前长度的大小。成功返回时,文件的长度为len。
这些函数也可以用来“截断”成一个更大的文件,类似lseek() past the end of a file。扩展的字节填充了零。
举例:
我们有一个文件pirate.txt,长度是74个字节。内容是:
pirate.txt
在运行如下代码后:
int testTruncate() {
int ret = truncate("../FileIO/pirate.txt", 45);
if(ret == -1){
perror("truncate");
return -1;
}
return 0;
}
pirate.txt after truncate
网友评论