【问题标题】:Why I couldnt detect my file is empty or not in C?为什么我无法检测到我的文件在 C 中是空的还是不在?
【发布时间】:2021-08-14 16:05:23
【问题描述】:

我尝试了几种方法来做到这一点,但我做不到。 代码面试:

    file = fopen(filename,"r");
    int size=0;
    if (file == NULL){
        printf("couldnt open: %s\n",filename);
    }
    else if(size==0){
        fseek(file,0,SEEK_END);
        size = ftell(file);
        fclose(file);
        if (size ==0){
            printf("empty");
        }
    }

我也尝试了 feof 函数,foef(file) 总是返回相同的值,它不关心文件是否为空。有什么帮助吗?

【问题讨论】:

  • 这似乎适用于 Linix。
  • 检查fseek()的返回值是0还是non 0;有无法查找的文件。另请注意,ftell() 返回一个 long,如果将其转换为 int,您可能会丢失精度。
  • else if (size==0) 为什么?你将它初始化为 0,所以这总是正确的。最好发布完整的实际代码,其他人可以复制、粘贴和按原样编译/运行。
  • 您不应该使用该方法来获取文件大小。在 Linux 上,使用 fstat(),在 Windows 上,使用 GetFileSize()。
  • @Archie uderscore_d 的意思是,当您在打开文件后检查else if(size==0){ 时,size 是总是 0,所以进行检查没有意义。跨度>

标签: c file detect


【解决方案1】:

您以文本模式打开文件,然后使用fseek() 和SEEK_END。

另一方面,标准规定只有 SEEK_SET 应该用于带有文本流的 fseek()。

因此,您的代码会调用未定义的行为。

引用N15707.21.9.2 fseek函数:

4 对于文本流,偏移量应为零,或偏移量应为返回的值 对与同一文件关联的流上的 ftell 函数的较早成功调用 SEEK_SET 从哪里来。

引自 N1570 4. 一致性:

2 如果出现在约束或运行时之外的“应”或“不应”要求- 违反约束,行为未定义。

【讨论】:

  • 请注意,某些系统(例如 Linux)将文本文件和二进制文件视为相同,因此尽管 C 标准未定义,但某些操作系统允许将其作为扩展名。
  • 读取为(偏移量应为零,)或(偏移量应为先前成功调用与同一文件关联的流上的 ftell 函数返回的值,并且应为 SEEK_SET),暗示 fseek(file,0,SEEK_END); 很好,而不是 UB。
  • C 具有“将文件位置指示器设置为文件结尾,与 fseek(file, 0, SEEK_END) 一样,对于二进制流具有未定义的行为...”。将SEEK_END 与二进制文件一起使用是潜在的UB
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
相关资源
最近更新 更多