创建文件,移至位置128并写入数据,但是,虽然我正在写入128,但读取时我需要从偏移量0而不是128读取它。有人可以指出我要去哪里了。写入后,打印文件的十六进制。我写该页面时,数据应打印在转储1(位置128)中。但是它显示在转储0(位置0)中。从外部文件的十六进制转储显示数据是我已写入的位置(128)。与模式或文件权限有关吗?我正在Linux操作系统上工作。 void readyCache() { fd = open("database.dat",O_RDWR|O_TRUNC|O_CREAT , S_IRUSR|S_IWUSR); } char* getPage(long pageNumber, int fd) { long offset; char* buffer = (char *)malloc(pageSize); offset = (pageNumber)*pageSize; lseek(fd, offset+pageSize, SEEK_SET); lseek(fd, offset, SEEK_SET); read(fd, buffer, pageSize); return buffer; } void setPage(long pageNumber,char* pageData, int fd) { long offset; offset = (pageNumber)*pageSize; lseek(fd, offset, SEEK_SET); write(fd, pageData, pageSize); } void hexdump(int fileDescriptor1, long pageNumber) { cout << endl; unsigned char readChar; int iterator = 0, j = 0; char * tempBuffer = (char *)malloc(pageSize); tempBuffer = getPage(pageNumber, fileDescriptor1); for(int i=0;i<pageSize;i++) { readChar = tempBuffer[i]; iterator++; j++; printf("%02x ", readChar);//%02x if (iterator == 16) { iterator = 0; cout<<endl; } } } int main() { readyCache(); char * tempBuffer = getPage(1, fd); int a = 1000; memcpy(tempBuffer, &a, sizeof(int)); setPage(1,tempBuffer, fd); cout<<"\nDump 0\n"; hexdump(fd, 0); cout<<"\nDump 1\n"; hexdump(fd, 1); close(fd); return 0; } 最佳答案 无论文件大小如何,您始终可以搜索到可以以“ off_t”数据类型存储的任何位置(与上面的Cris Dodd的回答相反)。真正的问题是您将C ++流IO(cout 如果您首先转换为纯C语言(将cout的所有用法更改为printf),则程序将按预期运行。C ++标准定义了一种方法“ sync_with_stdio(bool sync)”,可用于将C ++ iostream与stdio同步。如果不使用它,则同步是不确定的。关于c++ - C-使用lseek()获得的read()位置不正确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14205778/
10-15 01:24