在linux

时间:2017-11-03 15:55:32

标签: c linux unix filesystems eof

我无法理解EOF的工作原理以及我的电脑如何知道文件的大小。

例如,我制作了3个文件,test0,test1和test2。 我用这种方式创建了test0和test1:

int main(void) {

    /* */
    FILE* fp0 = fopen("/home/kevin/eclipse-workspaceC/FileMangment/src/test0", "w+");
    FILE* fp1 = fopen("/home/kevin/eclipse-workspaceC/FileMangment/src/test1", "w+");


    if (!fp0 || !fp1) {
        fprintf(stderr, "file pointer points to NULL\n");
        return 1;
    }

    fprintf(fp0, "abcd");
    fprintf(fp1, "abcd\n");

    fclose(fp0);
    fclose(fp1);

    return 0;
}

然后我创建了test2,右键单击 - >新文件和我写的文件里面:

abcd

最后没有空格或新线。 然后在bash上我运行了命令:wc -c test*; file test* 和输出:

4 test0
5 test1
5 test2
14 total
test0: ASCII text, with no line terminators
test1: ASCII text
test2: ASCII text

当我使用gedit观看文件时,它们似乎完全相同(没有新的线路建立)。

我知道\n是换行符而不是EOF(我真的无法理解这个EOF是什么),所以我的电脑怎么知道文件何时结束?如果磁盘块大小为4K,为什么它会在正确的字节数后停止并且它不会继续读取后面的内容?

为什么我会看到大量以这种方式解析文件的代码:

while((c=fgetc(infile))!=EOF){
putchar(c);
}

所以这意味着在某个地方有一个叫做(EOF)的角色??????? 但我无法在ascii表中找到它。而且我发现价值是-1 .... 非常非常混乱...

我的电脑是否解析了每个文件的知识是大小还是写在某处?

我计算机的某个地方必须是:

your file at position xyz has the size of blahblah...

那么这个地方在哪里?或者我应该谷歌什么? 因为我用Google搜索了像3Gozzilion这样的东西:我的文件大小存储在哪里ecc ...并且没有找到任何东西。我只是想知道这些信息存储在哪里。

2 个答案:

答案 0 :(得分:1)

在UNIX上,每个文件对应于文件系统的inode编号。在该inode中,您可以找到有关该文件的多个信息,包括文件大小。您可以在这里找到更多信息 : Overview of the Linux file system

答案 1 :(得分:0)

在发出类似

的命令时在unix系统上
ls -l 

输出类似于此

-rw-r--r--    1 user group       393 Nov  3 22:02 README.txt

这包括文件权限,所有者,组大小,创建时间,文件名等等。

在文件系统级别,该信息存储在inode中,即表示文件元数据的结构,实际上每个文件本身由inode编号表示。

在非常高的级别,每次读取调用都会增加光标位置以读取字节。在某些时候,这将达到文件的大小。在这种情况下,读取调用甚至可能不返回所请求的文件数。例如

观察下面的这个读取调用,我们试图从文件描述符fd表示的文件中读取大小字节数。

int nbytes = read( fd, buf, size );
然而,完全有可能nbytes可以<大小在这种情况下,下一次后续读取调用的大多数时间可能会因EOF而失败(如果到达文件末尾)。然而,还有其他情况,其中nbytes可能不等于大小。