【问题标题】:Is it possible to check, if a file is empty, without fseek() and without systemcalls?是否可以在没有 fseek() 且没有系统调用的情况下检查文件是否为空?
【发布时间】:2016-10-28 07:59:24
【问题描述】:

基本上只是标题。我正在尝试检查文件是否为空。问题是,这个文件会在几天内变得非常庞大(~1GB+),我觉得

fseek(fp,0,SEEK_END);
if(ftell(fp)==0){//init file}
rewind(fp);
//actually read the file 

时间很宝贵,因为您必须遍历整个文件。我也不想使用系统调用,因为我通常使用 Java,并尝试尽可能独立于平台工作(即不必为每个平台重写它,而只需重新编译它)。如果这根本不用担心,并且 fseek()... 可以轻松处理这些文件大小,请告诉我,但我认为这很耗时。

【问题讨论】:

  • 只读取第一个字节。如果是EOF,则文件为空。
  • fseek(fp,0,SEEK_END) 不一定很慢,即使对于大文件也是如此。 fseek 不需要“运行”整个文件。将文件视为 CD-Rom 而不是磁带。但正如之前的评论所说:读取第一个字节就足以确定文件是否为空。
  • @TahaPaksu 除非我完全误会 fstat 是一个系统调用,我目前正试图避免
  • 你存储的是实际的素数,还是一个状态位图?如果是前者,您将不得不搜索整个文件(可能是二分搜索),而在后者中,您可以直接查找状态位所在的位置。如果您当前存储的是 64 位值,该文件甚至可能更小,因为素数的频率超过 64 分之一。
  • @JacobusConradi 无论如何你都不能完全避免系统调用,因为即使读取文件最终也会使用系统调用。

标签: c file fseek


【解决方案1】:

如果不进行系统调用,您将无法对文件执行任何操作。

但是你为什么不想做一个系统调用呢?还是要避免调用名为 system() 的函数?

使用 stat() 或 stat()(取决于您是否已经打开了文件描述符)可能是检查文件是否为空的最佳和最快的方法。而且它不会改变文件的状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 2011-12-25
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    相关资源
    最近更新 更多