0

ファイルを作成し、場所128に移動してデータを書き込みますが、読み取り中に128で書き込みを行っていますが、128ではなくオフセット0から読み取る必要があります。

書き込み後、ファイルの 16 進数を出力します。そのページに書き込んでいるときに、データはダンプ 1 (ロケーション 128) に出力されるはずです。ただし、ダンプ 0 (場所 0) に表示されます。

外部からのファイルの 16 進ダンプは、データが私が書き込んだ場所 (128) であることを示しています。

モードやファイルのアクセス許可と関係がありますか? 私はLinux OSに取り組んでいます。

    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;
    }
4

1 に答える 1

1

ファイルサイズに関係なく、「off_t」データ型に格納できる任意の位置をいつでもシークできます(上記のCris Doddの回答とは対照的です)。

実際の問題は、C++ ストリーム IO (cout << endl など) と C 標準 IO (printf) および POSIX の基礎となる IO (lseek) を混在させていることです。彼らはお互いを混乱させています!

最初に純粋な C に変換する (cout の使用をすべて printf に変更する) と、プログラムは期待どおりに動作します。

C++ 標準では、C++ iostream を stdio と同期するために使用できるメソッド「sync_with_stdio(bool sync)」が定義されています。使用しない場合、同期は未定義です。

于 2013-01-08T03:09:04.160 に答える