繁体   English   中英

C-使用lseek()获得的read()位置不正确

[英]C - Inaccurate read() position obtained with lseek()

创建文件,移至位置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 << endl等)与C标准IO(printf)和POSIX基础IO(lseek)混合在一起。 他们彼此混淆!

如果您首先转换为纯C语言(将cout的所有用法更改为printf),则程序将按预期运行。

C ++标准定义了一种方法“ sync_with_stdio(bool sync)”,可用于将C ++ iostream与stdio同步。 如果不使用它,则同步是不确定的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM