我无法理解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 ...并且没有找到任何东西。我只是想知道这些信息存储在哪里。
答案 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可能不等于大小。