如何判断文件是否为空?

2024-03-24

如何判断文件是否为空?该文件由运行在Windows平台上的C程序打开。我想以附加模式打开一个文件,如果为空,首先打印一个标题。

// Open CSV & write header
report_csv = fopen("SNR.csv", "a+");
if (!report_csv) {
    fprintf(stderr, "Unable to open CSV output file...");
    return -1;
}
if (!ftell(report_csv)) {
    fprintf(report_csv, "Column A;Column B;Column C\n");
}
// ... print data to file
fclose(report_csv);

我正期待着ftell如果文件不为空,则返回当前文件大小,这是因为上面的代码是循环的。

然而,ftell总是返回0并且标题被打印多次。

我知道我可以fopen它与r并使用fseek/ftell/fclose进而fopen再次与a+,但我认为无需多次打开和关闭文件就可以做到这一点。


其实,当fopen以追加模式加载文件时,文件指针最初位于文件的开头。一旦你写了一些东西或者使用了它,它就会移动到它的末尾fseek.

我只需要添加fseek(report_csv, 0, SEEK_END);在我之前if (!ftell(report_csv)).

让我们检查一下。
Code:

#include <stdio.h>

int main(int argc, char **argv) {
    FILE *test;
    size_t size;
    char buf[100];

    /* Truncate file */
    test = fopen("test", "w");
    if (!test) {
        fprintf(stderr, "Cannot open file `test`!\n");
        return 1;
    }

    /* Write something */
    fprintf(test, "Something. ");
    fclose(test);

    /* Open in append */
    test = fopen("test", "a+");
    if (!test) {
        fprintf(stderr, "Cannot open `test` in append mode!\n");
        return 1;
    }

    /* Try to get the file size */
    size = ftell(test);
    printf("File pointer is: %d\n", size);
    fseek(test, 0, SEEK_END);
    size = ftell(test);
    printf("After `fseek(test, 0, SEEK_END)`, the file pointer is: %d\n", size);

    /* Append */
    fprintf(test, "And that. ");
    fclose(test);

    /* Same without fseek */
    test = fopen("test", "a+");
    if (!test) {
        fprintf(stderr, "Cannot open `test` in append mode!\n");
        return 1;
    }
    fprintf(test, "Hello! ");
    size = ftell(test);
    printf("File size is now: %d\n", size);
    fclose(test);

    /* Try to read */
    test = fopen("test", "r");
    if (!test) {
        fprintf(stderr, "Unable to open `test` for reading!\n");
        return 1;
    }
    printf("File contents:\n\t");
    while (test && !feof(test)) {
        fgets(buf, sizeof(buf), test);
        printf("%s", buf);
    }

    /* Cleanup & exit */
    fclose(test);
    printf("\n\nExiting.\n");

    return 0;
}

Output:

File pointer is: 0
After `fseek(test, 0, SEEK_END)`, the file pointer is: 11
File size is now: 28
File contents:
        Something. And that. Hello!

Exiting.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何判断文件是否为空? 的相关文章

  • 为什么存在 async 关键字

    浏览 msdn 9 频道视频时 我发现以下未答复的评论 希望有人能解释一下 我不明白 async 关键字的意义 为什么不直接允许 任何时候方法返回任务时都会使用await关键字 就像迭代器一样 可以在任何返回 IEnumerable 的方法
  • 具有不同大小结构的结构数组的 malloc()

    如果每个结构都包含一个大小不同的字符串数组 那么如何正确地 malloc 一个结构数组 因此每个结构可能有不同的大小 并且不可能 realloc 结构体数量 sizeof 结构体名称 after malloc 初始大小 sizeof 结构名
  • System.IO.IOException:由于意外>数据包格式,握手失败?

    有谁知道这意味着什么 System Net WebException 底层连接已关闭 发送时发生意外错误 gt System IO IOException 由于意外 握手失败 数据包格式 在 System Net Security SslS
  • (const T v) 在 C 中从来都不是必需的,对吗?

    例如 void func const int i 在这里 const是不必要的 因为所有参数都是按值传递的 包括指针 真的吗 C 中的所有参数确实都是按值传递 这意味着无论您是否包含该参数 实际参数都不会改变const or not 然而
  • CultureInfo 的实例(来自相同的文化)根据操作系统而变化

    我有一个网站 上面写着这样的日期 CultureInfo cultureInfo CultureInfo GetCultures CultureTypes AllCultures FirstOrDefault c gt string Equ
  • C++中delete和delete[]的区别[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的删除与删除 运算符 https stackoverflow com questions 2425728 delete vs delete operators in c 我写了一个包含两个指针的
  • 在 C# Winforms 应用程序中嵌入 Windows XP 主题

    我有一个旧版 C Windows 窗体应用程序 其布局是根据 Windows XP 默认主题设计的 由于需要将其作为 Citrix 应用程序进行分发 该应用程序现在看起来像经典主题应用程序 因为 Citrix 不鼓励使用主题系统服务 所以
  • mprotect 之后 malloc 导致分段错误

    在使用 mprotect 保护内存区域后第一次调用 malloc 时 我遇到分段错误 这是执行内存分配和保护的代码片段 define PAGESIZE 4096 void paalloc int size Allocates and ali
  • 无法解析远程名称 - webclient

    我面临这个错误 The remote name could not be resolved russgates85 001 site1 smarterasp net 当我请求使用 Web 客户端读取 html 内容时 出现错误 下面是我的代
  • 分配器感知容器和propagate_on_container_swap

    The std allocator traits模板定义了一些常量 例如propagate on container copy move assign让其他容器知道它们是否应该在复制或移动操作期间复制第二个容器的分配器 我们还有propag
  • C# 中的常量和只读? [复制]

    这个问题在这里已经有答案了 可能的重复 const 和 readonly 之间有什么区别 https stackoverflow com questions 55984 what is the difference between cons
  • 二叉树中的 BFS

    我正在尝试编写二叉树中广度优先搜索的代码 我已将所有数据存储在队列中 但我不知道如何访问所有节点并消耗它们的所有子节点 这是我的 C 代码 void breadthFirstSearch btree bt queue q if bt NUL
  • .NET 客户端中 Google 表格中的条件格式请求

    我知道如何在 Google Sheets API 中对值和其他格式进行批量电子表格更新请求 但条件格式似乎有所不同 我已正确设置请求 AddConditionalFormatRuleRequest formatRequest new Add
  • 为什么要在 C++ 中使用 typedef?

    可以说我有 set
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • 为什么文件更新时“如果较新则复制”不复制文件?

    我在 Visual Studio Express 中有一个解决方案 如下所示 The LogicSchemaC 中的类 将在运行时解析指定的 XML 文件 以下是在main的方法Program cs LogicSchema ls new L
  • C++、三元运算符、std::cout

    如何使用 C 用三元运算符编写以下条件 int condition1 condition2 condition3 int double result int or double std cout lt lt condition1 resul
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne

随机推荐

  • C# NetworkStream - 在读取时区分关闭套接字和 0 字节数组

    已解决 该问题基于错误的假设 在使用 TCP 时 我遇到了 NetworkStream Read 在两种不同情况下返回值 0 的问题 我很难区分 一些背景知识 我有一个有效的客户端 服务器解决方案 使用长度前缀消息通过 TCP 进行通信 然
  • 使用 Create React App 和 TypeScript 进行 Jest 测试时出现isolatedModules错误?

    我已经使用 typescript 启动了一个 Create React App 项目 当我编写测试时 我收到编译器错误 something test tsx test something gt expect 1 toBe 1 错误是 TS1
  • select2 插件不在 jquery 模式对话框内时工作正常

    我在 jquery 对话框中使用 select2 插件 但不起作用 当下拉时 焦点移动到输入控件 但立即离开它 不允许我输入任何内容 这是 HTML div title Asignar servicios a usuarios div
  • C# tableLayoutPanel 滚动除顶行之外的所有内容

    我正在使用 winforms 和 C 并查看 TableLayoutPanel 是否可以在大桌子上有滚动条 但不能让顶行滚动 这与 Excel 中 冻结窗格 选项的工作方式类似 我只想冻结顶行而不是其他任何东西 另外 我的桌子足够大 我还有
  • AWS lambda:pty 设备不足

    我尝试在 AWS lambda 中使用 pexpect 库 但收到以下错误 ERROR OSError out of pty devices 事实证明 任何包含 pty spawn 的代码都会在 lambda 中失败 下面是失败的 lamb
  • Android Paging 3 - 从 PagingData 对象获取数据列表

    我正在使用新的 jetpack Paging 3 库 我有一个特定的用例 我想使用视图模型在两个屏幕之间共享这些数据 一个屏幕需要分页数据 对于第二个屏幕 我想要此数据的简单列表 不是分页列表 我需要使用该列表 我不想在 PagingDat
  • R/Shiny 中的 Plain Dygraphs JavaScript 选项

    有没有办法在 R 中使用普通 Dygraphs JavaScript 选项 更具体地说是 Shiny http dygraphs com options html http dygraphs com options html 我觉得JS h
  • 更改actionBar下拉背景颜色

    如何更改显示 添加联系人 和 关于 的背景颜色 现在有点灰色 但我希望它是白色的 这是一个带有下拉菜单的操作栏 而不是旋转器 我不使用那个actionbarsherlock 的东西 例如 您现有的父母Style定义 仅添加android p
  • 如何在 MATLAB 中编写函数

    我想写一个返回值的函数f y 对于任何值y f y tan sin y sin tan y 如何在 MATLAB 中将其编写为函数 这是一个适合您目的的示例函数 function y f x y tan sin x sin tan x en
  • numpy.chararray 发生了什么

    Input chararr np chararray 3 5 chararr a chararr Output chararray b a b a b a b a b a b a b a b a b a b a b a b a b a b
  • 如何将字符串转换为 ifstream

    我正在尝试使用 ifstream 打开一个文件 并且想使用字符串作为路径 我的程序创建一个字符串路径 它会编译但保持空白 string path NameOfTheFile it would be something close to c
  • 谷歌地理编码 API 的计费问题

    计费已添加到我们的 gmaps api 项目中 而且该账单肯定会传播 因为它是在大约 4 周前添加的 在项目仪表板中 计费显示为可用 但是 当我们尝试调整配额时 它说我们需要激活计费 我们联系了 Google 的几乎所有渠道 并被告知完全没
  • CSS 多重文本装饰

    我想要拥有 h2 下划线同时闪烁 有没有办法只修改CSS样式来实现这一点 h2 例如 h2 text decoration underline blink or h2 text decoration underline text decor
  • 将 ereg_replace 替换为 preg_replace [重复]

    这个问题在这里已经有答案了 您好 需要更改功能ereg replace theData 到 preg replace To port ereg replace to preg replace你需要将正则表达式放在一对之间分隔符 你的正则表达
  • 特别分发:无法安装应用程序

    我正在开发一个ios应用程序 仅适用于iphone 并试图让其他人测试它 我通过临时分发在自己的设备上安装该应用程序没有问题 当我尝试在另一个人的设备上安装时 它总是失败 并显示消息 此时无法安装 xxxxx 我正在使用 xcode 5 以
  • Jython 不会将 PYTHONPATH 加载到 sys.path 中

    根据我读到的内容 sys path 应该由 PYTHONPATH 设置 在 Python 中 它是这样工作的 但在 Jython 中则不然 我可以绕过 Dpython path 但我想知道为什么 Jython 表现不佳 qa Scantro
  • 在 Visual Studio 2010 中使用正则表达式查找和替换来小写

    我正在使用 Visual Studio 2010 中的查找和替换功能来更改字段的编码样式 所有实例类似于 m MyField 应该 myField 但我只能设法得到 MyField using Find what m a zA Z Repl
  • 无法安装 sqlite3-ruby gem

    我已经安装了 xcode 3 0 我需要安装 sqlite3 ruby gem 用于 rhosync 当我跑步时 sudo gem install l sqlite3 ruby 我收到以下错误 Building native extensi
  • 重复的 typedef - 在 C 中无效但在 C++ 中有效?

    我想要一个标准参考 为什么以下代码会触发 C 中的合规性警告 使用gcc pedantic typedef 重新定义 但在 C 中没问题 g pedantic typedef struct Foo Foo typedef struct Fo
  • 如何判断文件是否为空?

    如何判断文件是否为空 该文件由运行在Windows平台上的C程序打开 我想以附加模式打开一个文件 如果为空 首先打印一个标题 Open CSV write header report csv fopen SNR csv a if repor