- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想向二进制文件添加一个结构,但首先我需要检查该文件是否存储了以前的数据,如果没有,我可以添加该结构,否则我必须读取所有存储的数据并粘贴结构在正确的位置,但我对如何检查文件是否为空感到困惑,我考虑尝试这样的事情:
size = 0
if(fp!=NULL)
{
fseek (fp, 0, SEEK_END);
size = ftell (fp);
rewind(fp);
}
if (size==0)
{
// print your error message here
}
但是如果文件为空或仍未创建,文件指针怎么能不为 NULL 呢?如果我可以简单地做这样的事情,那么使用 ftell()
的意义何在:
if(fp==NULL){fp=fopen("data.bin","wb");
fwrite(&struct,sizeof(struct),1,ptf);
fclose(fp);}
我知道在其他情况下可以返回 NULL,例如 protected 文件,但我仍然无法理解当文件为空时文件指针始终返回 NULL 时,使用 ftell()
是如何有效的。帮助将不胜感激:)
最佳答案
i need to check whether the file has previous data stored in it
可能没有可移植且可靠的方法来做到这一点(该文件可能在检查期间发生变化,因为其他进程正在使用它)。例如,在 Unix 或 Linux 上,该文件可能由另一个打开 process当您自己的程序运行时写入它(甚至可能发生在您的 ftell
和您的 rewind
之间)。并且您的程序可能在几个进程中运行。
您可以使用operating system具体功能。对于 POSIX(包括 Linux 和许多 Unix,如 MacOSX 或 Android),您可以使用 stat(2)查询文件状态(包括其大小与st_size
)。但之后,某些其他进程可能仍会将数据写入该文件。
您可以考虑咨询 locking ,例如与 flock(2) ,但随后您采用系统范围的约定,即每个使用该文件的程序都会锁定它。
你可以使用一些database与 ACID特性。查看sqlite或进入RDBMS系统如 PostGreSQL或MariaDB 。或者像 gdbm 这样的索引文件库.
您可以继续编码,隐含的假设(但要注意这一点)只有您的程序正在使用该文件,并且您的程序最多有一个进程在运行它。
if the file is empty [...] how can the file pointer not be
NULL
?
如Increasingly Idiotic answered , fopen
可能会失败,但通常不会在空文件上失败。当然,你需要handle fopen
failure (另见this)。因此,大多数时候,您的 fp
是有效的,并且您的代码块(假设没有其他进程模拟更改该文件)使用 ftell
和 rewind
是检查文件是否为空的近似方法。顺便说一句,如果您从该文件中读取(例如使用 fread
或 fgetc
)某些内容,那么如果您的文件为空,则读取将会失败,因此您可能不需要检查之前是空虚的。
查询某些 fopen
-ed 文件的状态(包括大小)的 POSIX 特定方法是使用 fileno(3)和 fstat(2)在声明 struct stat mystat;
fstat(fileno(fp), &mystat)
一样
关于对使用 ftell() 检查文件是否为空感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50303001/
我想向二进制文件添加一个结构,但首先我需要检查该文件是否存储了以前的数据,如果没有,我可以添加该结构,否则我必须读取所有存储的数据并粘贴结构在正确的位置,但我对如何检查文件是否为空感到困惑,我考虑尝试
我正在尝试从二进制文件中读取数据。我得到了一个包含所有变量的结构来提取数据。我正在使用 fread 函数,我需要获取文件的总大小作为 freads 输入之一。我正在使用 ftell 函数查找大小,但在
这个问题在这里已经有了答案: ftell at a position past 2GB (4 个答案) 关闭 9 年前。 根据 unix 手册页 ftell 要么返回 -1 以指示错误。 函数定义为
我遇到了一个问题,ftell 返回的值不正确。我的代码在 linux 上的 netbeans 中运行时报告正确,但完全相同的代码在 windows 上的 netbeans 中运行时(使用 mingw)
我正在查看 SO 帖子 fseek does not work when file is opened in "a" (append) mode当我们以“a”模式打开文件时,我对 ftell() 返回
有没有办法在原始文件描述符而不是 FILE* 上执行 ftell() 所做的(返回文件中的当前位置)?我认为应该有,因为您可以使用 lseek() 查找原始文件描述符。 我知道我可以使用 fdopen
我想计算文件中的字母数。我已经尝试使用 Windows 和 Linux 测试编辑器编写文件,但两者都给出了相同的值(7)。该文件有 5 个字符('P','2','\n','#','\n'),为什么 f
fseek(f, 0, SEEK_END); size = ftell(f); 如果 ftell(f) 告诉我们当前文件位置,这里的大小应该是文件末尾到开头的偏移量。为什么大小不是 ftell(f
我正在我的 Windows 操作系统上查看文件 Agents.h,我想查看没有注释的 C++ 代码。我将它们剥离出来,以便用我的旧程序更清楚地看到代码,但令我惊讶的是它花了大约 2秒完成。文件的大小是
我试图让我的程序为每个 child 一次读取一行(每行包含一个 int)。每次我执行此读取时,它都会继续读取第一行。 这是我的代码的基础。 void forkChildren (int nChildr
我正在尝试编写一个函数,该函数将按字符串中的程序名称终止实例 unsigned int kill_all_program_instances(const char * program_name){
所以我有一个文本文件,其中存储了数据。现在我想计算每个数据在其中的位置,所以我使用了下面的方法。 while (fscanf(fp, "%d", &id) != EOF) {
#include #include int main() { long int count; FILE *file=NULL; file=fopen("sample.txt","r+
我有一些代码在服务器上运行,直到它被移动到不同的系统。问题似乎出在这里: 给定一个我在别处定义的结构: user1_type user1; /* structure cont
这个问题在这里已经有了答案: Why does ftell() shows wrong position after fread()? (3 个答案) 关闭 5 年前。 我有一个名为 myfile.
我正在编写一个程序,将许多文件连接成一个。我的目标是让用户插入名称为“xxx”的文件数量“n”,然后我将从文件“xxx001.txt”读取到“xxx00n.txt”。每当文件打开时,我使用 fseek
我需要循环遍历目录data并读取字符串中满足特定条件的每个文件并对其执行某些操作。由于某种原因,它在 fseek 调用后失败(输出只是目录中第一个文件的名称)。 知道我做错了什么吗? #include
在 32 位系统上,如果以二进制模式打开的文件的当前位置指示器超过 2GB 点,ftell 将返回什么?在C99标准中,这是未定义的行为,因为ftell必须返回一个long int(最大值为 >2**
如何在 Java 中查找文本文件?我正在处理一个基于文本的日志文件,并且想要检查我的工作,以便它可以在未来调用我的程序时恢复。 我正在寻找类似于 C stdio fseek()/ftell() 功能的
这一行 Assert(pos == ftell(file)); 在我的代码中使用,当文件包含非 ASCII 字符时,此行失败。 我该怎么办? 为了清楚起见,这里更新了整个函数: int getTerm
我是一名优秀的程序员,十分优秀!