gpt4 book ai didi

c++ - UNIX文件读写优于不写

转载 作者:行者123 更新时间:2023-11-28 05:33:20 24 4
gpt4 key购买 nike

我正在尝试在文件中找到命中并通过重写来修改它。但是字段 Effectue 的修改(来自结构 TRAVAIL)不适用。我检查了我是否正在替换正确的发生(注释部分)但是当我再次调用该函数时,我仍然得到第一次出现的 Effectue 设置为 false

TRAVAIL RechercheProchainTravail() {
int i, fp;
TRAVAIL travailRetour;

if ((fp = open("Travaux.dat", O_RDWR | O_CREAT | O_TRUNC, 0664)) == -1) {
perror("Err open Travaux.dat");
exit(1);
}

// init
for (i = 0; TravauxInit[i].IndiceLieu > 0; i++)
write(fp, &TravauxInit[i], sizeof(TRAVAIL));

// remise au debut
lseek(fp, 0, SEEK_SET);

//lecture
for (i = 0; TravauxInit[i].IndiceLieu > 0; i++) {
read(fp, &travailRetour, sizeof(TRAVAIL));
if (travailRetour.Effectue == false) {
travailRetour.Effectue = true;
lseek(fp, -sizeof(TRAVAIL), SEEK_CUR);
/*read(fp, &travailRetour, sizeof(TRAVAIL));
Trace(" indice; %d effect %d", travailRetour.IndiceLieu, travailRetour.Effectue);
lseek(fp, -sizeof(TRAVAIL), SEEK_CUR);*/
write(fp, &travailRetour, sizeof(TRAVAIL));
break;
}
}
close(fp);

return travailRetour;
}

编辑:我更改了打开方式以防止文件被截断,正如彼得注意到的那样,但问题仍然存在,我仍然访问第一次出现的事件,因为写入不会更改 Effectue 字段值。

这是我的代码编辑:

    if (access( "Travaux.dat", F_OK ) != -1) { // si existe ouvrir
if ((fp = open("Travaux.dat", O_RDWR, 0664)) == -1) {
perror("Err open Travaux.dat");
exit(1);
}
} else { // sinon creer
if ((fp = open("Travaux.dat", O_RDWR | O_CREAT | O_TRUNC, 0664)) == -1) {
perror("Err open Travaux.dat");
exit(1);
}
}

这不是 lseek 问题,因为读取测试显示了正确的出现。

最佳答案

这肯定有一个潜在的问题:

lseek(fp, -sizeof(TRAVAIL), SEEK_CUR);

如果 size_t 小于 off_t-sizeof(TRAVAIL) 是一个大的无符号值(SIZE_MAX - sizeof(TRAVAIL ) + 1) 被转换为 off_t,而不是您希望通过一个结构向后查找的负值。

你可以这样修复它:

lseek(fp, -(off_t)sizeof(TRAVAIL), SEEK_CUR);

此外,您应该检查 readwritelseek 系统调用的返回值,以确保一切按预期进行。

如果您正在为 Windows 编译,还要添加标志 O_BINARY

关于c++ - UNIX文件读写优于不写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38902220/

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