【发布时间】:2017-11-03 15:55:31
【问题描述】:
我无法理解 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...
那么这个地方在哪里?或者我应该谷歌什么? 因为我在谷歌上搜索了 3Gozzilion 之类的东西:我的文件大小存储在哪里 ecc... 并没有找到任何东西。我只想知道这些信息存储在哪里。
【问题讨论】:
-
文件系统中的文件信息有文件的实际大小(正在使用的字节数)。 I/O 库和/或操作系统使用它来限制您可以从文件中读取的内容。
-
没有字符是
EOF。fgetc不返回char。它在文件末尾返回一个提升为int或EOF的字符。 -
"那么我的电脑如何知道文件何时结束?"文件长度、创建/修改时间、文件名等存储在别处。此元数据通常存储在文件夹/目录中。
-
file pointer points to NULL不是真正有用的错误消息。检查每个fopen之后的错误情况并使用perror退出打印错误消息,或使用strerror! -
@chux 元数据从不存储在文件夹中,除非是完全损坏的文件系统,例如 FAT。
标签: c linux unix filesystems eof