我正在尝试在文件中找到匹配并通过写入来修改它。但是字段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;
}
修改 我更改了打开以防止文件被peter注意到被截断,但问题仍然是相同的,我仍然访问第一次出现,因为写入不会更改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
问题,因为读取测试显示正确的事件。
答案 0 :(得分:1)
这肯定存在潜在的问题:
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);
此外,您应该检查read
,write
和lseek
系统调用的返回值,以确保一切按预期进行。
如果您正在为Windows编译,还要添加标记O_BINARY
。