ファイル内でヒットを見つけようとしていて、書き込みによってそれを変更しようとしています。しかし、Effectue
(構造TRAVAIL
からの)フィールドの変更は適用されません。私は、私は右の(コメント部分が発生)を交換していたことを確認したが、私はまだに設定して最初の出現を得ている関数を呼び出すとき。UNIXファイルの書き込みと書き込み以外の書き込み
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;
}
EDIT: ピーターが気づいたように私は切り捨てされてからファイルを防ぐために、オープンを変更しましたが、問題はまだ同じである書き込みが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
問題ではありません。
現在のコードが示すように、関数を再度呼び出すときにファイル全体を再初期化していませんか? – Peter
'off_t'は署名されており、' size_t'はそうではないので、 '-sizeof(TRAVAIL)'を 'lseek()'の第2引数として渡すことは間違っているか、実装定義です。 – EOF
ああ、確かにピーターが正しいと私は完全にファイルが初期化されるのを忘れてしまった、私はばかげている:p –