0

コードは

char buf1[] = "abcdefghij";
char buf2[] = "ABCDEFGHIJ";

int
main(int argc, char *argv[])
{
    int fd;

    if((fd = creat("file.hole", 0777)) < 0)
        perror("creat error");

    if(write(fd, buf1, 10) != 10)
        perror("buf1 write error");
    if(lseek(fd, 04000, SEEK_SET) == -1)
        perror("lseek error");

    if(write(fd, buf2, 10) != 10)
        perror("buf2 write error");

    exit(EXIT_SUCCESS);
}

によってファイルを読み取る

od -c file.hole

および出力:

0000000   a   b   c   d   e   f   g   h   i   j  \0  \0  \0  \0  \0  \0
0000020  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
0004000   A   B   C   D   E   F   G   H   I   J
0004012

lseek を削除して file.nohole を作成すると、出力は次のようになります。

0000000   a   b   c   d   e   f   g   h   i   j   A   B   C   D   E   F
0000020   G   H   I   J
0000024

私を混乱させる2つの問題があります。

> 1.At output1, why there are 30 * '\0' after j
> 2.output1: why file ends with 0004012 not 0004010
4

1 に答える 1

2

1.output1 で、なぜ j の後に 30 * '\0' があるのか

30 ではありませんが、ほぼ 04000odです。巨大で繰り返しが多かったため、出力を切り捨てました。なぜゼロがあるのですか?プログラムにそれらを挿入するように指示したためです。lseek()ファイルをパディングしました。

ファイルが 0004010 ではなく 0004012 で終わる理由

そうではありません -odアドレスを 16 進数ではなく 8 進数で出力します (ご想像のとおり)。

于 2013-06-16T13:46:27.520 に答える