创建一个文件,移动到位置128并写入数据但是,在读取时我需要从偏移0而不是128读取它,虽然我写的是128.有人可以指出我哪里出错。
写完后,打印文件的十六进制。当我写到该页面时,数据应该打印在转储1(位置128)中。但它显示在转储0(位置0)。
外部文件的Hexdump显示数据是我写入的位置(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;
}
答案 0 :(得分:1)
无论文件大小如何,您都可以随时寻找可以存储在“off_t”数据类型中的任何位置(与上面Cris Dodd的答案相反)。
您真正的问题是您正在将C ++流IO(cout&lt;&lt; endl等)与C标准IO(printf)和POSIX底层IO(lseek)混合。他们互相混淆!
如果您首先转换为纯C(将cout的所有用法更改为printf),您的程序将按预期工作。
C ++标准定义了一个方法“sync_with_stdio(bool sync)”,您可以使用该方法将C ++ iostream与stdio同步。如果不使用它,则同步未定义。