gpt4 book ai didi

c - 文件指针位置

转载 作者:太空宇宙 更新时间:2023-11-04 00:33:43 26 4
gpt4 key购买 nike

这是代码片段

typedef struct
{
double testA;
double testB[500];
bool isProcessed;
} MYSTURCT;

我有一个二进制文件,它是用多个“myStruct”类型的结构编写的。

现在,在另一个函数中,我正在尝试读取文件并在中间更新。

void test()
{
FILE* fp = fopen (testFile, "r+")

MYSTURCT* myPtr = malloc (sizeof (MYSTRUCT));

while ( fread (myPtr,sizeof(MYSTRUCT),1,fp) )
{
if (!myPtr->isProcessed)
{
//update some thing int he struct

myPtr->testA = 100.00;

fseek (fp, -sizeof(MYSTRUCT), SEEK_CUR);

fwrite (myPtr,sizeof(MYSTRUCT), 1,fp);

}
}
}

一旦发现未处理的内容,我会更新内存中的结构,然后尝试将结构写入磁盘。 (首先通过寻找 CURR - sizeof(struct))位置然后将结构写入磁盘。

我的应用程序中发生的事情是在执行 fseek 之后,我的

fp->_ptr 变得一团糟,它失去了在我的流中的位置轨迹。

我在这里做错了什么吗?

最佳答案

-sizeof(STRUCT) 有潜在危险。 sizeof(STRUCT) 是无符号类型,如果它至少与 int 一样宽,则它的提升类型(-sizeof(STRUCT) 表达式的类型)将也是无符号的,并且具有大约 UINT_MAX - sizeof(STRUCT) + 1 或可能的 ULONG_MAX - sizeof(STRUCT)+ 1 的值。

如果你运气不好(例如 32 位 size_t,64 位长),它的 UINT_MAX - sizeof(STRUCT) + 1 和一个 long int 可能能够容纳这个大的正值和搜索不会做你想做的事。

您可以考虑进行位置保存和恢复:

fpos_t pos;

if (fgetpos(fp, &pos) != 0)
{
/* position save failed */
return;
}

/* read struct */

if (fsetpos(fp, &pos) != 0)
{
/* position restore failed */
return;
}

/* write struct */

fgetposfsetpos 使用 fpos_t 因此在 fseekftell 不会。

关于c - 文件指针位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1429204/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com